https服务器post数据hW3HTML5中文学习网 - HTML5先行者学习网
代码如下 | |
function curlPost($url, $data, $timeout = 30)hW3HTML5中文学习网 - HTML5先行者学习网 {hW3HTML5中文学习网 - HTML5先行者学习网 $ssl = substr($url, 0, 8) == "https://" ? TRUE : FALSE;hW3HTML5中文学习网 - HTML5先行者学习网 $ch = curl_init();hW3HTML5中文学习网 - HTML5先行者学习网 $opt = array(hW3HTML5中文学习网 - HTML5先行者学习网 CURLOPT_URL => $url,hW3HTML5中文学习网 - HTML5先行者学习网 CURLOPT_POST => 1,hW3HTML5中文学习网 - HTML5先行者学习网 CURLOPT_HEADER => 0,hW3HTML5中文学习网 - HTML5先行者学习网 CURLOPT_POSTFIELDS => (array)$data,hW3HTML5中文学习网 - HTML5先行者学习网 CURLOPT_RETURNTRANSFER => 1,hW3HTML5中文学习网 - HTML5先行者学习网 CURLOPT_TIMEOUT => $timeout,hW3HTML5中文学习网 - HTML5先行者学习网 );hW3HTML5中文学习网 - HTML5先行者学习网 if ($ssl)hW3HTML5中文学习网 - HTML5先行者学习网 {hW3HTML5中文学习网 - HTML5先行者学习网 $opt[CURLOPT_SSL_VERIFYHOST] = 1;hW3HTML5中文学习网 - HTML5先行者学习网 $opt[CURLOPT_SSL_VERIFYPEER] = FALSE;hW3HTML5中文学习网 - HTML5先行者学习网 }hW3HTML5中文学习网 - HTML5先行者学习网 curl_setopt_array($ch, $opt);hW3HTML5中文学习网 - HTML5先行者学习网 $data = curl_exec($ch);hW3HTML5中文学习网 - HTML5先行者学习网 curl_close($ch);hW3HTML5中文学习网 - HTML5先行者学习网 return $data;hW3HTML5中文学习网 - HTML5先行者学习网 }hW3HTML5中文学习网 - HTML5先行者学习网 $data = curlPost('https://www.111cn.net', array('p'=>'hello'));hW3HTML5中文学习网 - HTML5先行者学习网 echo ($data);hW3HTML5中文学习网 - HTML5先行者学习网 |
-----------------------------我是分割线--------------------------------hW3HTML5中文学习网 - HTML5先行者学习网
其实这是告诉服务器不进行SSL认证,并不是真的走HTTPShW3HTML5中文学习网 - HTML5先行者学习网
如果要真正使用HTTPS,那么需要提供CA证书hW3HTML5中文学习网 - HTML5先行者学习网
上面关于SSL部分按照如下设置:hW3HTML5中文学习网 - HTML5先行者学习网
代码如下 | |
01.CURLOPT_SSL_VERIFYPEER 设置为 true ,说明进行SSL证书认证 hW3HTML5中文学习网 - HTML5先行者学习网 02.CURLOPT_SSL_VERIFYHOST 设置为 2, 说明进行严格认证 hW3HTML5中文学习网 - HTML5先行者学习网 03.CURLOPT_CAINFO 设置为证书的路径 hW3HTML5中文学习网 - HTML5先行者学习网 |
为方便说明,先上代码吧~ 这是今天重新封装的一个函数hW3HTML5中文学习网 - HTML5先行者学习网
代码如下 | |
/** hW3HTML5中文学习网 - HTML5先行者学习网 * curl POST hW3HTML5中文学习网 - HTML5先行者学习网 * hW3HTML5中文学习网 - HTML5先行者学习网 * @param string url hW3HTML5中文学习网 - HTML5先行者学习网 * @param array 数据 hW3HTML5中文学习网 - HTML5先行者学习网 * @param int 请求超时时间 hW3HTML5中文学习网 - HTML5先行者学习网 * @param bool HTTPS时是否进行严格认证 hW3HTML5中文学习网 - HTML5先行者学习网 * @return string hW3HTML5中文学习网 - HTML5先行者学习网 */ hW3HTML5中文学习网 - HTML5先行者学习网 function curlPost($url, $data = array(), $timeout = 30, $CA = true){ hW3HTML5中文学习网 - HTML5先行者学习网 hW3HTML5中文学习网 - HTML5先行者学习网 $cacert = getcwd() . '/cacert.pem'; //CA根证书 hW3HTML5中文学习网 - HTML5先行者学习网 $SSL = substr($url, 0, 8) == "https://" ? true : false; hW3HTML5中文学习网 - HTML5先行者学习网 hW3HTML5中文学习网 - HTML5先行者学习网 $ch = curl_init(); hW3HTML5中文学习网 - HTML5先行者学习网 curl_setopt($ch, CURLOPT_URL, $url); hW3HTML5中文学习网 - HTML5先行者学习网 curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); hW3HTML5中文学习网 - HTML5先行者学习网 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout-2); hW3HTML5中文学习网 - HTML5先行者学习网 if ($SSL && $CA) { hW3HTML5中文学习网 - HTML5先行者学习网 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); // 只信任CA颁布的证书 hW3HTML5中文学习网 - HTML5先行者学习网 curl_setopt($ch, CURLOPT_CAINFO, $cacert); // CA根证书(用来验证的网站证书是否是CA颁布) hW3HTML5中文学习网 - HTML5先行者学习网 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // 检查证书中是否设置域名,并且是否与提供的主机名匹配 hW3HTML5中文学习网 - HTML5先行者学习网 } else if ($SSL && !$CA) { hW3HTML5中文学习网 - HTML5先行者学习网 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何证书 hW3HTML5中文学习网 - HTML5先行者学习网 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); // 检查证书中是否设置域名 hW3HTML5中文学习网 - HTML5先行者学习网 } hW3HTML5中文学习网 - HTML5先行者学习网 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); hW3HTML5中文学习网 - HTML5先行者学习网 curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); //避免data数据过长问题 hW3HTML5中文学习网 - HTML5先行者学习网 curl_setopt($ch, CURLOPT_POST, true); hW3HTML5中文学习网 - HTML5先行者学习网 curl_setopt($ch, CURLOPT_POSTFIELDS, $data); hW3HTML5中文学习网 - HTML5先行者学习网 //curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); //data with URLEncode hW3HTML5中文学习网 - HTML5先行者学习网 hW3HTML5中文学习网 - HTML5先行者学习网 $ret = curl_exec($ch); hW3HTML5中文学习网 - HTML5先行者学习网 //var_dump(curl_error($ch)); //查看报错信息 hW3HTML5中文学习网 - HTML5先行者学习网 hW3HTML5中文学习网 - HTML5先行者学习网 curl_close($ch); hW3HTML5中文学习网 - HTML5先行者学习网 return $ret; hW3HTML5中文学习网 - HTML5先行者学习网 } hW3HTML5中文学习网 - HTML5先行者学习网 |
如果URL地址是https打头,那就走SSL,否则就走普通的HTTP协议。hW3HTML5中文学习网 - HTML5先行者学习网
是否走HTTPS的话就安全了吗?其实SSL也有不同的验证程度。hW3HTML5中文学习网 - HTML5先行者学习网
例如需不需要验证证书中的公用名呢?(BTW:公用名(Common Name)一般来讲就是填写你将要申请SSL证书的域名 (domain)或子域名(sub domain)。)hW3HTML5中文学习网 - HTML5先行者学习网
需要验证主机名吗?hW3HTML5中文学习网 - HTML5先行者学习网
是任何证书都信任呢还是只信任CA颁布的呢?hW3HTML5中文学习网 - HTML5先行者学习网
(我擦嘞,电池快没点了,只捡关键地儿说了 - -|||)hW3HTML5中文学习网 - HTML5先行者学习网
如果网站SSL证书买的是CA的(通常比较贵),那么访问时可以使用比较严格的认证,即:hW3HTML5中文学习网 - HTML5先行者学习网
代码如下 | |
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); // 只信任CA颁布的证书 hW3HTML5中文学习网 - HTML5先行者学习网 curl_setopt($ch, CURLOPT_CAINFO, $cacert); // CA根证书(用来验证的网站证书是否是CA颁布) hW3HTML5中文学习网 - HTML5先行者学习网 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // 检查证书中是否设置域名,并且是否与提供的主机名匹配 hW3HTML5中文学习网 - HTML5先行者学习网 |
如果网站的证书是自己生成的,或者是网上的小机构申请的,那么访问时如果使用严格认证则不会通过,直接返回false。(对了,返回false时可以打印curl_error($ch)查看具体错误信息。)此时可以根据情况通过降低验证程度来保证正常访问,例如:hW3HTML5中文学习网 - HTML5先行者学习网
代码如下 | |
hW3HTML5中文学习网 - HTML5先行者学习网 2 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);hW3HTML5中文学习网 - HTML5先行者学习网 |
// 检查证书中是否设置域名(为0也可以,就是连域名存在与否都不验证了)hW3HTML5中文学习网 - HTML5先行者学习网
平时我们使用浏览器访问各个https网站时,有时会遇到证书不受信的提示,其实就是因为这些网站的证书不是正规CA机构颁布的。hW3HTML5中文学习网 - HTML5先行者学习网
市面上各种浏览器中都内置了CA根证书列表信息,访问有CA颁布证书的网站时,会根据根证书验证这些网站的证书,所以就不会有这个提示了。hW3HTML5中文学习网 - HTML5先行者学习网
关于CA根证书文件,其实就是包含了各个主要CA机构的公钥证书,用来验证网站的证书是否是这些机构颁发的