https服务器post数据
代码如下 复制代码
function curlpost($url, $data, $timeout = 30)
{
$ssl = substr($url, 0, 8) == https:// ? true : false;
$ch = curl_init();
$opt = array(
curlopt_url => $url,
curlopt_post => 1,
curlopt_header => 0,
curlopt_postfields => (array)$data,
curlopt_returntransfer => 1,
curlopt_timeout => $timeout,
);
if ($ssl)
{
$opt[curlopt_ssl_verifyhost] = 1;
$opt[curlopt_ssl_verifypeer] = false;
}
curl_setopt_array($ch, $opt);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
$data = curlpost('https://www.bkjia.c0m', array('p'=>'hello'));
echo ($data);
-----------------------------我是分割线--------------------------------
其实这是告诉服务器不进行ssl认证,并不是真的走https
如果要真正使用https,那么需要提供ca证书
上面关于ssl部分按照如下设置:
代码如下 复制代码
01.curlopt_ssl_verifypeer 设置为 true ,说明进行ssl证书认证
02.curlopt_ssl_verifyhost 设置为 2, 说明进行严格认证
03.curlopt_cainfo 设置为证书的路径
为方便说明,先上代码吧~ 这是今天重新封装的一个函数
代码如下 复制代码
/**
* 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)查看具体错误信息。)此时可以根据情况通过降低验证程度来保证正常访问,例如:
代码如下 复制代码
2 curl_setopt($ch, curlopt_ssl_verifyhost, 1);
// 检查证书中是否设置域名(为0也可以,就是连域名存在与否都不验证了)
平时我们使用浏览器访问各个https网站时,有时会遇到证书不受信的提示,其实就是因为这些网站的证书不是正规ca机构颁布的。
市面上各种浏览器中都内置了ca根证书列表信息,访问有ca颁布证书的网站时,会根据根证书验证这些网站的证书,所以就不会有这个提示了。
关于ca根证书文件,其实就是包含了各个主要ca机构的公钥证书,用来验证网站的证书是否是这些机构颁发的
更多详细内容请查看:http://www.bkjia.c0m/phper/php/57145.htm
http://www.bkjia.com/phpjc/714730.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/714730.htmltecharticle三年前写过一篇《一个简陋的支持https的php curl封装函数》,当时只是知其然不知其所以然,今天来详细梳理一下。 https服务器post数据 代码...
