php使用curl访问https示例分享
发布:smiling 来源: PHP粉丝网 添加日期:2020-08-27 22:10:51 浏览: 评论:0
curl是利用URL语法在命令行方式下工作的开源文件传输工具,下面介绍一下php使用curl访问https的示例,大家参考使用吧。
为方便说明,先上代码吧。
- /**
- * 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)
最后说一个和SSL无关的东西:
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
这个主要是为了解决POST时数据过长问题。
Tags: curl https
相关文章
- ·PHP启动提示Unable to load dynamic library php_curl.dll怎么办(2013-12-02)
- ·php中的curl使用心得详解(2014-02-22)
- ·php curl 伪造IP来源实例(2014-07-30)
- ·利用php curl实现程序登录新浪微博代码(2014-08-01)
- ·php curl post数据的问题(2014-08-04)
- ·php curl、fopen、file_get_contents实例代码(2014-08-17)
- ·php通过curl函数取得数据、模拟登陆、POST数据(2014-09-12)
- ·XAMPP使用CURL提示“Call to undefined function curl_init”问题(2014-09-12)
- ·php CURLOPT错误Warning: curl_setopt() [function.curl-setopt]:...(2014-09-20)
- ·php curl函数采集网页出现乱码问题解决方法(2014-09-21)
- ·解决php curl获取网页内容提示405 method not allowed状态码(2014-09-21)
- ·win7(X64)系统环境PHP Curl函数不能使用(2014-09-21)
- ·php curl实现http与https请求实例(2015-04-04)
- ·CURL模拟POST提交的二种方法实例(2015-04-09)
- ·php curl模仿登录人人网发布动态实例(2015-04-11)
- ·PHP用CURL伪造来源IP与来源URL地址程序代码(2015-04-11)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)