php使用curl的SSL和非SSL
来源:互联网 发布:淘宝招商 编辑:程序博客网 时间:2024/06/08 03:48
三年前写过一篇《一个简陋的支持HTTPS的PHP CURL封装函数》,当时只是知其然不知其所以然,今天来详细梳理一下。
为方便说明,先上代码吧~ 这是今天重新封装的一个函数
/** * curl POST * * @param string url * @param array 数据 * @param int 请求超时时间 * @param bool HTTPS时是否进行严格认证 * @return string */ function curlPost($url, $data = array(), $timeout = 30, $CA = true){ $cacert = getcwd() . '/cacert.pem'; //CA根证书 $SSL = substr($url, 0, 8) == "https://" ? true : false; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout-2); if ($SSL && $CA) { curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); // 只信任CA颁布的证书 curl_setopt($ch, CURLOPT_CAINFO, $cacert); // CA根证书(用来验证的网站证书是否是CA颁布) curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // 检查证书中是否设置域名,并且是否与提供的主机名匹配 } else if ($SSL && !$CA) { curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何证书 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); // 检查证书中是否设置域名 } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); //避免data数据过长问题 curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); //curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); //data with URLEncode $ret = curl_exec($ch); //var_dump(curl_error($ch)); //查看报错信息 curl_close($ch); return $ret; }
如果URL地址是https打头,那就走SSL,否则就走普通的HTTP协议。
是否走HTTPS的话就安全了吗?其实SSL也有不同的验证程度。
例如需不需要验证证书中的公用名呢?(BTW:公用名(Common Name)一般来讲就是填写你将要申请SSL证书的域名 (domain)或子域名(sub domain)。)
需要验证主机名吗?
是任何证书都信任呢还是只信任CA颁布的呢?
(我擦嘞,电池快没点了,只捡关键地儿说了 - -|||)
如果网站SSL证书买的是CA的(通常比较贵),那么访问时可以使用比较严格的认证,即:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); // 只信任CA颁布的证书 curl_setopt($ch, CURLOPT_CAINFO, $cacert); // CA根证书(用来验证的网站证书是否是CA颁布) curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // 检查证书中是否设置域名,并且是否与提供的主机名匹配
如果网站的证书是自己生成的,或者是网上的小机构申请的,那么访问时如果使用严格认证则不会通过,直接返回false。(对了,返回false时可以打印curl_error($ch)查看具体错误信息。)此时可以根据情况通过降低验证程度来保证正常访问,例如:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何证书 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); // 检查证书中是否设置域名(为0也可以,就是连域名存在与否都不验证了)
平时我们使用浏览器访问各个https网站时,有时会遇到证书不受信的提示,其实就是因为这些网站的证书不是正规CA机构颁布的。
市面上各种浏览器中都内置了CA根证书列表信息,访问有CA颁布证书的网站时,会根据根证书验证这些网站的证书,所以就不会有这个提示了。
关于CA根证书文件,其实就是包含了各个主要CA机构的公钥证书,用来验证网站的证书是否是这些机构颁发的。
这里的这个文件是来源于mozilla的源码树,又转换成PEM格式证书文件。(大家可以到这里下载现成的http://curl.haxx.se/ca/cacert.pem)
- php使用curl的SSL和非SSL
- PHP CURL简单使用(支持ssl连接和proxy代理连接,简单的GET/POST常规操作,文件上传)
- php使用curl库进行ssl双向认证
- php使用curl库进行ssl双向认证
- php使用curl库进行ssl双向认证
- PHP多进程爬虫-Curl中的 SSL 和 pcntl_fork
- php 用curl 得到ssl双向认证的文件
- php curl函数免ssl校验
- 避过SSL的方法和使用SSL的方法
- CURL使用SSL证书访问HTTPS
- CURL使用SSL证书访问HTTPS
- CURL使用SSL证书访问HTTPS
- CURL使用SSL证书访问HTTPS
- Mac安装curl带SSL,PHP扩展curl,解决SSL peer handshake failed问题
- 带ssl证书验证的curl请求
- PHP封装ssl非对称加密算法
- 非对称加密、ssl和tls的工作原理
- curl error:14090086:SSL
- Android SDK版本和API Level对照表(最新最全)
- C语言sscanf函数的总结
- 【坑】mongodb启动报错
- 如何让vue文件中的代码在Sublime Text 3中高亮?
- Java常见HTTP请求方法RequestMethod
- php使用curl的SSL和非SSL
- 分布式缓存技术redis学习系列(五)——redis实战(redis与spring整合,分布式锁实现)
- CS231n课程笔记翻译:卷积神经网络笔记
- 函数调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。
- PAT A1130. Infix Expression (25)
- xamarin android异步更新UI线程
- Swift 结构体
- 博客
- Xcode 清理存储空间