PHP CURL 和 HTTPS
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4372710/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
PHP CURL & HTTPS
提问by StackOverflowNewbie
I found this function that does an AWESOME job (IMHO): http://nadeausoftware.com/articles/2007/06/php_tip_how_get_web_page_using_curl
我发现这个功能做得很好(恕我直言):http: //nadeausoftware.com/articles/2007/06/php_tip_how_get_web_page_using_curl
/**
* Get a web file (HTML, XHTML, XML, image, etc.) from a URL. Return an
* array containing the HTTP server response header fields and content.
*/
function get_web_page( $url )
{
$options = array(
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // don't return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => "", // handle all encodings
CURLOPT_USERAGENT => "spider", // who am i
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
);
$ch = curl_init( $url );
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$err = curl_errno( $ch );
$errmsg = curl_error( $ch );
$header = curl_getinfo( $ch );
curl_close( $ch );
$header['errno'] = $err;
$header['errmsg'] = $errmsg;
$header['content'] = $content;
return $header;
}
The only problem I have is that it doesn't work for https://. Anny ideas what I need to do to make this work for https? Thanks!
我唯一的问题是它不适用于 https://。任何想法我需要做什么才能使 https 工作?谢谢!
回答by SystemX17
Quick fix, add this in your options:
快速修复,将其添加到您的选项中:
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false)
Now you have no idea what host you're actually connecting to, because cURL will not verify the certificate in any way. Hope you enjoy man-in-the-middle attacks!
现在您不知道实际连接的是哪个主机,因为 cURL 不会以任何方式验证证书。希望你喜欢中间人攻击!
Or just add it to your current function:
或者只是将它添加到您当前的功能中:
/**
* Get a web file (HTML, XHTML, XML, image, etc.) from a URL. Return an
* array containing the HTTP server response header fields and content.
*/
function get_web_page( $url )
{
$options = array(
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // don't return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => "", // handle all encodings
CURLOPT_USERAGENT => "spider", // who am i
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
CURLOPT_SSL_VERIFYPEER => false // Disabled SSL Cert checks
);
$ch = curl_init( $url );
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$err = curl_errno( $ch );
$errmsg = curl_error( $ch );
$header = curl_getinfo( $ch );
curl_close( $ch );
$header['errno'] = $err;
$header['errmsg'] = $errmsg;
$header['content'] = $content;
return $header;
}
回答by Gavin Palmer
I was trying to use CURL to do some https API calls with php and ran into this problem. I noticed a recommendation on the php site which got me up and running: http://php.net/manual/en/function.curl-setopt.php#110457
我试图使用 CURL 用 php 进行一些 https API 调用并遇到了这个问题。我注意到 php 站点上的一个推荐,它让我开始运行:http: //php.net/manual/en/function.curl-setopt.php#110457
Please everyone, stop setting CURLOPT_SSL_VERIFYPEER to false or 0. If your PHP installation doesn't have an up-to-date CA root certificate bundle, download the one at the curl website and save it on your server:
http://curl.haxx.se/docs/caextract.html
Then set a path to it in your php.ini file, e.g. on Windows:
curl.cainfo=c:\php\cacert.pem
Turning off CURLOPT_SSL_VERIFYPEER allows man in the middle (MITM) attacks, which you don't want!
请大家不要将 CURLOPT_SSL_VERIFYPEER 设置为 false 或 0。 如果您的 PHP 安装没有最新的 CA 根证书包,请在 curl 网站下载一个并将其保存在您的服务器上:
http://curl.haxx.se/docs/caextract.html
然后在你的 php.ini 文件中设置一个路径,例如在 Windows 上:
curl.cainfo=c:\php\cacert.pem
关闭 CURLOPT_SSL_VERIFYPEER 允许中间人 (MITM) 攻击,这是您不想要的!
回答by Accountant ?
Another option like Gavin Palmer answer is to use the .pem
file but with a curl option
另一个选项,如 Gavin Palmer 答案是使用该.pem
文件,但带有 curl 选项
download the last updated
.pem
file from https://curl.haxx.se/docs/caextract.htmland save it somewhere on your server(outside the public folder)set the option in your code instead of the
php.ini
file.
.pem
从https://curl.haxx.se/docs/caextract.html下载最后更新的文件并将其保存在服务器上的某个位置(公共文件夹之外)在您的代码而不是
php.ini
文件中设置选项。
In your code
在你的代码中
curl_setopt($ch, CURLOPT_CAINFO, $_SERVER['DOCUMENT_ROOT'] . "/../cacert-2017-09-20.pem");
NOTE: setting the cainfo in the php.ini
like @Gavin Palmer did is better than setting it in your code like I did, because it will save a disk IO every time the function is called, I just make it like this in case you want to test the cainfo file on the fly instead of changing the php.ini
while testing your function.
注意:php.ini
像@Gavin Palmer 那样设置 cainfo 比在你的代码中设置它更好,因为它会在每次调用函数时保存一个磁盘 IO,我只是这样设置,以防你想测试cainfo 文件,而不是php.ini
在测试您的功能时更改。
回答by Hammad Khan
One important note, the solution mentioned above will not work on local host, you have to upload your code to server and then it will work. I was getting no error, than bad request, the problem was I was using localhost (test.dev,myproject.git). Both solution above work, the solution that uses SSL cert is recommended.
一个重要的注意事项,上面提到的解决方案在本地主机上不起作用,您必须将代码上传到服务器,然后它才能起作用。我没有收到错误,而不是错误的请求,问题是我使用的是本地主机(test.dev,myproject.git)。上述两种解决方案都有效,推荐使用 SSL 证书的解决方案。
Go to https://curl.haxx.se/docs/caextract.html, download the latest cacert.pem. Store is somewhere (not in public folder - but will work regardless)
Use this code
前往https://curl.haxx.se/docs/caextract.html,下载最新的 cacert.pem。商店在某处(不在公共文件夹中 - 但无论如何都会工作)
使用此代码
".$result; //echo "
Path:".$_SERVER['DOCUMENT_ROOT'] . "/ssl/cacert.pem"; // this is for troubleshooting only ?>
".$result; //echo "
Path:".$_SERVER['DOCUMENT_ROOT'] . "/ssl/cacert.pem"; // 这仅用于故障排除 ?>
- Upload the code to live server and test.
- 将代码上传到实时服务器并进行测试。