用curl获取https请求
2015-10-26 16:42
691 查看
今天一个同事反映,使用curl发起https请求的时候报错:“SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed”很明显,验证证书的时候出现了问题。使用curl如果想发起的https请求正常的话有2种做法:方法一、设定为不验证证书和host。在执行curl_exec()之前。设置option$ch = curl_init();......curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); 方法二、设定一个正确的证书。本地ssl判别证书太旧,导致链接报错ssl证书不正确。我们需要下载新的ssl 本地判别文件http://curl.haxx.se/ca/cacert.pem放到 程序文件目录curl 增加下面的配置 curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,true); ;
curl_setopt($ch,CURLOPT_CAINFO,dirname(__FILE__).'/cacert.pem');大功告成(本人验证未通过。。。报错信息为:SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed)如果对此感兴趣的话可以参看国外一大神文章。http://unitstep.net/blog/2009/05/05/using-curl-in-php-to-access-https-ssltls-protected-sites/为了防止某天该文章被Q今复制过来。内容如下:From PHP, you can access the useful cURL Library (libcurl) to make requests to URLs using a variety of protocols such as HTTP, FTP, LDAP and even Gopher. (If you’ve spent time on the *nix command line, most environments also have the
![](http://pic002.cnblogs.com/images/2011/118715/2011110816561023.jpg)
Then click on “View Certificate”:
![](http://pic002.cnblogs.com/images/2011/118715/2011110816563622.jpg)
Bring up the “Details” tab of the cerficates page, and select the certificate at the top of the hierarchy. This is the CA certificate.
![](http://pic002.cnblogs.com/images/2011/118715/2011110816570177.jpg)
Then click “Export”, and save the CA certificate to your selected location, making sure to select the X.509 Certificate (PEM) as the save type/format.
![](http://pic002.cnblogs.com/images/2011/118715/2011110816572883.jpg)
Now we need to modify the cURL setup to use this CA certificate, with
1: Check that the common name attribute at least exists
2: Check that the common name exists and that it matches the host name of the server
If you have
http://blog.csdn.net/clh604/article/details/8528787
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); 方法二、设定一个正确的证书。本地ssl判别证书太旧,导致链接报错ssl证书不正确。我们需要下载新的ssl 本地判别文件http://curl.haxx.se/ca/cacert.pem放到 程序文件目录curl 增加下面的配置 curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,true); ;
curl_setopt($ch,CURLOPT_CAINFO,dirname(__FILE__).'/cacert.pem');大功告成(本人验证未通过。。。报错信息为:SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed)如果对此感兴趣的话可以参看国外一大神文章。http://unitstep.net/blog/2009/05/05/using-curl-in-php-to-access-https-ssltls-protected-sites/为了防止某天该文章被Q今复制过来。内容如下:From PHP, you can access the useful cURL Library (libcurl) to make requests to URLs using a variety of protocols such as HTTP, FTP, LDAP and even Gopher. (If you’ve spent time on the *nix command line, most environments also have the
curlcommand available that uses the libcurl library)In practice, however, the most commonly-used protocol tends to be HTTP, especially when usingPHP for server-to-server communication. Typically this involves accessing another web server as part of a web service call, using some method such as XML-RPC or REST to query a resource. For example, Delicious offers a HTTP-based API to manipulate and read a user’s posts. However, when trying to access a HTTPS resource (such as the delicious API), there’s a little more configuration you have to do before you can get cURL working right in PHP.
The problem
If you simply try to access a HTTPS (SSL or TLS-protected resource) in PHP using cURL, you’re likely to run into some difficulty. Say you have the following code: (Error handling omitted for brevity)// Initialize session and set URL. $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); // Set so curl_exec returns the result instead of outputting it. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Get the response and close the channel. $response = curl_exec($ch); curl_close($ch);If
$urlpoints toward an HTTPS resource, you’re likely to encounter an error like the one below:
Failed: Error Number: 60. Reason: SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failedThe problem is that cURL has not been configured to trust the server’s HTTPS certificate. The concepts of certificates and PKI revolves around the trust of Certificate Authorities (CAs), and by default, cURL is setup to not trust any CAs, thus it won’t trust any web server’s certificate. So why don’t you have problems visiting HTTPs sites through your web browser? As it happens, the browser developers were nice enough to include a list of default CAs to trust, covering most situations, so as long as the website operator purchased a certificate from one of these CAs.
The quick fix
There are two ways to solve this problem. Firstly, we can simply configure cURL to accept any server(peer) certificate. This isn’t optimal from a security point of view, but if you’re not passing sensitive information back and forth, this is probably alright. Simply add the following line before callingcurl_exec():
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);This basically causes cURL to blindly accept any server certificate, without doing any verification as to which CA signed it, and whether or not that CA is trusted. If you’re at all concerned about the data you’re passing to or receiving from the server, you’ll want to enable this peer verification properly. Doing so is a bit more complicated.
The proper fix
The proper fix involves setting theCURLOPT_CAINFOparameter. This is used to point towards a CA certificate that cURL should trust. Thus, any server/peer certificates issued by this CA will also be trusted. In order to do this, we first need to get the CA certificate. In this example, I’ll be using the https://api.del.icio.us/ server as a reference.First, you’ll need to visit the URL with your web browser in order to grab the CA certificate. Then, (in Firefox) open up the security details for the site by double-clicking on the padlock icon in the lower right corner:
![](http://pic002.cnblogs.com/images/2011/118715/2011110816561023.jpg)
Then click on “View Certificate”:
![](http://pic002.cnblogs.com/images/2011/118715/2011110816563622.jpg)
Bring up the “Details” tab of the cerficates page, and select the certificate at the top of the hierarchy. This is the CA certificate.
![](http://pic002.cnblogs.com/images/2011/118715/2011110816570177.jpg)
Then click “Export”, and save the CA certificate to your selected location, making sure to select the X.509 Certificate (PEM) as the save type/format.
![](http://pic002.cnblogs.com/images/2011/118715/2011110816572883.jpg)
Now we need to modify the cURL setup to use this CA certificate, with
CURLOPT_CAINFOset to point to where we saved the CA certificate file to.
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_CAINFO, getcwd() . "/CAcerts/BuiltinObjectToken-EquifaxSecureCA.crt");The other option I’ve included,
CURLOPT_SSL_VERIFYHOSTcan be set to the following integer values:0: Don’t check the common name (CN) attribute
1: Check that the common name attribute at least exists
2: Check that the common name exists and that it matches the host name of the server
If you have
CURLOPT_SSL_VERIFYPEERset to false, then from a security perspective, it doesn’t really matter what you’ve set
CURLOPT_SSL_VERIFYHOSTto, since without peer certificate verification, the server could use any certificate, including a self-signed one that was guaranteed to have a CN that matched the server’s host name. So this setting is really only relevant if you’ve enabled certificate verification.This ensures that not just any server certificate will be trusted by your cURL session. For example, if an attacker were to somehow redirect traffic from api.delicious.com to their own server, the cURL session here would not properly initialize, since the attacker would not have access to a server certificate (i.e. would not have the private key) trusted by the CA we added. These steps effectively export the trusted CA from the web browser to the cURL configuration.
More information
If you have the CA certificate, but it is not in the PEM format (i.e. it is in a binary or DER format that isn’t Base64-encoded), you’ll need to use something like OpenSSL to convert it to the PEM format. The exact command differs depending on whether you’re converting from PKCS12 or DER format.There is aCURLOPT_CAPATHoption that allows you to specify a directory that holds multiple CA certificates to trust. But it’s not as simple as dumping every single CA certificate in this directory. Instead, they CA certificates must be named properly, and the OpenSSL
c_rehashutility can be used to properly setup this directory for use by cURL.
http://blog.csdn.net/clh604/article/details/8528787
相关文章推荐
- httpclient 面https认证,带cookie访问
- 【Http】httputils实现get/post请求
- socket网络编程复习笔记(二):套接字基本原理(下)
- 获取手机版本,手机型号,系统版本,手机设备唯一序列号,手机应用版本,手机网络类型的总结
- DSAPI多功能组件编程应用-实时统计-CPU/内存/硬盘/网络
- [Servlet]HttpServletRequest的请求参数、标头、编码
- web服务器测试工具Gulu——HTTP接口测试工具
- php模拟HTTP协议请求
- IIS7.5上的REST服务的Put操作发生HTTP Error 405.0 - Method Not Allowed 解决方法
- tcp/udp的区别
- tcpdump
- iOS 网络编程模式总结
- java常用设计模式(转载http://www.cnblogs.com/hnrainll/archive/2011/12/29/2305582.html)
- 网络开发---UIWebView
- 在电视端网络视频播放加载一个视频预览的方法(电视基于安卓系统)
- 一种在本地搭载一个服务器的工具和方法,Android开发测试网络视频可以用
- ImageLoader下载图片
- Toast 数据加载,内容加载,网络图片加载提示
- JVM通过代理服务器连接网络的参数设置
- php模拟HTTP响应