草庐IT

php - 无法通过 HTTPS 获取 file_get_contents 或 cURL

coder 2023-12-31 原文

我一直在用file_get_contents多年来抓取网站的内容。

最近,他们将 URL 更新为 HTTPSfile_get_contents停止工作。

我已经阅读了以前的问题并尝试了标记的解决方案,但没有任何效果。

例如,我试过 this ,并返回以下内容:

openssl: yes http wrapper: yes https wrapper: yes wrappers: array ( 0 => 'https', 1 => 'ftps', 2 => 'compress.zlib', 3 => 'compress.bzip2', 4 => 'php', 5 => 'file', 6 => 'data', 7 => 'http', 8 => 'ftp', 9 => 'zip', )

于是我尝试了 this solutionfile_get_contents ,无济于事。

然后我尝试了 this solutioncURL完全忽略加密,无济于事

无论我尝试哪种解决方案,没什么被退回。

我有 不是 已添加 extension=php_openssl.dllallow_url_include = OnPHP.ini根据 this由于此特定站点位于共享主机上,并且托管公司不允许编辑 PHP.ini 文件,尽管默认情况下它们可能已启用。

我试过其他 HTTPS网站,有些工作,有些没有,我不知道为什么。

我在同一个 Web 主机上从不同的服务器(和不同的 IP)尝试过,它也不适用于目标 HTTPS地点。

我该如何调试和解决这个问题?

更新:

phpinfo 显示:
curl cURL support enabled cURL Information libcurl/7.36.0 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5 libssh2/1.8.0openssl OpenSSL support enabled OpenSSL Version OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008

最佳答案

最终答案
如果您的 ISP 不会将 openSSL 升级到 TLS 1.2,您应该认真考虑另一个 ISP。您应该使用下面的“SSL SERVER TEST”链接来测试您的服务器。您的服务器可能存在 SSL 安全漏洞。
您尝试连接的服务器仅支持 TLS 1.2 和 TLS 1.1
不支持:TLS 1.0、SSL 3、SSL2。
当发出 SSL 请求时,作为 SSL 协议(protocol)的一部分,curl 向主机服务器提供密码列表。然后服务器根据 curl 提供的列表选择要使用的密码协议(protocol)。
您尝试连接的主机支持这些密码套件

TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (0xc030)  
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)  
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 (0x9f) 
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 (0x9e)  
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (0xc028)  
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (0xc014)  
TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 (0x6b)  
TLS_DHE_RSA_WITH_AES_256_CBC_SHA (0x39) 
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (0xc027) 
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (0xc013)  
TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 (0x67)  
TLS_DHE_RSA_WITH_AES_128_CBC_SHA (0x33) 
TLS_RSA_WITH_AES_256_GCM_SHA384 (0x9d) 
TLS_RSA_WITH_AES_128_GCM_SHA256 (0x9c) 
TLS_RSA_WITH_AES_256_CBC_SHA256 (0x3d) 
TLS_RSA_WITH_AES_256_CBC_SHA (0x35) 
TLS_RSA_WITH_AES_128_CBC_SHA256 (0x3c) 
TLS_RSA_WITH_AES_128_CBC_SHA (0x2f) 
因为您的 openSSL 于 2008 年 7 月发布,而 TLSv1.2 于下个月即 2008 年 8 月发布,所以您拥有的最好的是 TLSv1.1
可能的临时修复,直到您升级
我没有高度的信心这对你有用
你应该用这样的东西来测试你自己服务器的 SSL SSL SERVER TEST
如果您的服务器支持 TLS1.1,那么您可以尝试以下操作。我无法对此进行测试,因为我没有与您在旧服务器上使用您的 openSSL 版本相同的 curl 版本。
使用 curl 选项 CURLOPT_SSL_CIPHER_LIST 限制主机服务器使用 TLS 1.1 以外的任何内容
curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, 'TLSv1');
curl_setopt($ch, CURL_SSLVERSION_TLSv1_1);
如果没有,请尝试:
curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, 'DEFAULT');
curl_setopt($ch, CURL_SSLVERSION_TLSv1_1);
底线
出于比这个问题更多的原因,您需要升级您的 openSSL。
-------------------------------------------------------------------------

 
 -
以前的故障排除低于此点
我做的第一件事是关闭浏览器中的 javascript。如果我可以在没有 javascript 的情况下使用浏览器检索页面,我知道我可以使用 PHP 获取它。
我构建的请求看起来与浏览器中的完全一样。我转到检查器的网络选项卡并编辑请求 header 并将其复制并粘贴到我的代码中。

$request = array();
$request[] = 'Host: example.com';
$request[] = 'Connection: keep-alive';
$request[] = 'Pragma: no-cache';
$request[] = 'Cache-Control: no-cache';
$request[] = 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8';
$request[] = 'User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36';
$request[] = 'DNT: 1';
$request[] = 'Origin: https://example.com';
$request[] = 'Referer: https://example.com/entry/login';
$request[] = 'Accept-Encoding: gzip, deflate';
$request[] = 'Accept-Language: en-US,en;q=0.8';
初始化 curl
$url = 'https://example.com/entry/login';
$ch = curl_init($url);
添加请求参数
curl_setopt($ch, CURLOPT_HTTPHEADER, $request);
告诉 curl 包含标题
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_HEADER, true);
返回响应
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
按照重定向
重定向可能是一个陷阱。您可能不必跟踪和分析响应。重定向通常用于设置 cookie。
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_COOKIESESSION , true );
让 curl 处理压缩
curl_setopt($ch, CURLOPT_ENCODING,"");
设置超时参数
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT,10);
curl_setopt($ch, CURLOPT_FAILONERROR,true);
发出请求并得到响应
以下将获得您需要了解的有关请求的所有信息。 $info 也将包含所有重定向 header 。如果进行了重定向,则 $responseHeader 将包含所有响应 header 。
更新:新的经过全面测试的代码
这可能无关紧要,因为这也适用于我的机器:
echo file_get_contents($url);
如果 curl 失败,这段代码应该给你一个失败的原因。
更改网址。 这个属于一个客户。
<?php
header('content-type: text/plain');

$url = 'https://amxemr.com';
$ch = curl_init($url);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_ENCODING,"");
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT,10);
curl_setopt($ch, CURLOPT_FAILONERROR,true);
curl_setopt($ch, CURLOPT_ENCODING,"");
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_HEADER, true);


$data = curl_exec($ch);
if (curl_errno($ch)){
    echo 'Retreive Base Page Error: ' . curl_error($ch);
}
else {
  $info = rawurldecode(var_export(curl_getinfo($ch),true));

 // Get the cookies:

  $skip = intval(curl_getinfo($ch, CURLINFO_HEADER_SIZE)); 
  $responseHeader= substr($data,0,$skip);
  $data= substr($data,$skip);
  echo "HEADER: $responseHeader\n";
  echo "\n\nINFO: $info\n\nDATA: $data";
}  
?>
如果上述方法不起作用,请运行 phpinfo()
<?php
phpinfo();
?>  
应该有一个 curl 部分和 openSSL。

--------------------------------------------------------------------更新二
好消息
我知道问题所在,并且能够复制您遇到的错误。
Retreive Base Page Error: 
Unknown SSL protocol error in connection to www.xxxx.com:443 
NOTE xxx 是您给我的链接中的站点,您现在可以删除该消息。
有趣的是,我有一台我没有更新的服务器。幸运的是,它拥有与 2008 年 7 月相同版本的 openSSL。
您需要升级您的 openSSL。此外,该服务器上的 file_get_contents() 也失败了。它适用于 2013 年 2 月版本的 openSSL 以及 2014 年 6 月。
我不能说是否需要升级其他任何东西,例如使用 openSSL 的功能可能(或可能不需要)升级。
我同意这句格言,如果它没有坏就不要修理它。我确实相信一些升级实际上是降级的。我还在XP。但它坏了,你需要修理它。
至少它不是黑暗中的修复。我相信你必须升级。这是一个有条不紊的故障排除程序,能够复制您的错误。您可以返回使用 file_get_contents()也是。

关于php - 无法通过 HTTPS 获取 file_get_contents 或 cURL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42175050/

有关php - 无法通过 HTTPS 获取 file_get_contents 或 cURL的更多相关文章

  1. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  2. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  3. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  4. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  5. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  6. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  7. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  8. ruby-on-rails - 无法在centos上安装therubyracer(V8和GCC出错) - 2

    我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e

  9. ruby-on-rails - rails : save file from URL and save it to Amazon S3 - 2

    从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex

  10. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

随机推荐