php使用curl访问https示例分享

时间:2016.04.20 发布人:xnsbb

php使用curl访问https示例分享

已解决问题

谷歌xnsbb用户在2016.04.20提交了关于“宝马x1php使用curl访问https示例分享”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2025-03-01T23:43:23。希望大家能够帮助她。

详细问题描述及疑问:期待您的答案,千言万语,表达不了我的感激之情,我已铭记在心 !

希望以下的回答,能够帮助你。

第1个回答

用户名:dwui4ol6  

为方便说明,先缺宽死有亲通五承了助上代码吧

复制代码代码如下:
/**
*curlPOST
*
*@p点aramstringurl
*@paramarray**
*@paramint请求超时时间
*@paramboolh**TTPS时是否进行严格认
*@returnstring
*/
functioncurlPost($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_VERIFYPE是省顾称损ER,true);//只信鱼法前距针最演队演绿草任CA颁布的**
curl_setopt($ch,CURLOPT_CAINFO,$cacert);//CA根**(用来验的网站**是否是CA颁布)
curl_setopt($c备光h,CURLOPT_SSL_VERIFYh**OST,2);//检查**中是否设置域名,并且是否与样府帝从垂提供的主机名匹配
}elseif($SSL&&!$CA){
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);//信任任何**
curl_setopt($ch,CURLO沉准图晶许击门情断让PT_SSL_VERIFYh**OST,1);//检查**中是否设置域名
}
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,包请广物拿杆六据CURLOPT_h**TTPh**EADER,array('Expect:')应阿歌波纸常居而);//避免data**过长沉合问题
curl松但盾状问_setopt($ch,CURLOPT_POST,true);
curl_setopt($ch,CURLOPT_P取向按依木此底OSTFIELDS,$data);
//curl_setopt($ch,CURLOPT_POSTFIELDS,http_build_query($data));//datawithURLEncode

$ret=curl_exec($c丰夜粮国烟h);
//var_dump(curl_error($ch));//查看报错信息

c括海效书率严府氧掉巴url_close($ch);
return$re但香t;
}

如果URL地址是h鸡尼脸字想减ttps打头,那就走SSL,否统报洲优则就走普通的h**TTP协议。

是否走h**TTPS的话就安全了吗?其实SSL也有不同的验程度。

例如需不需要验**中的公用名呢?(**W:公用名(CommonName)一般来讲就是填写你将要申请SSL**的域名(domain)或子域名(subdomain)。)

需要验主机名吗?

是任何**都信任呢还是只信任CA颁布的呢?

(我擦嘞,电池快没点了,只捡关键地儿说了--|||)

如果网站SSL**买的是CA的(通常比较贵),那么访问时可以使用比较严格的认,即:

复制代码代码如下:
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,true);//只信任CA颁布的**
curl_setopt($ch,CURLOPT_CAINFO,$cacert);//CA根**(用来验的网站**是否是CA颁布)
curl_setopt($ch,CURLOPT_SSL_VERIFYh**OST,2);//检查**中是否设置域名,并且是否与提供的主机名匹配

如果网站的**是自己生成的,或者是网上的小机构申请的,那么访问时如果使用严格认则不会通过,直接返回false。(对了,返回false时可以打印curl_error($ch)查看具体错误信息。)此时可以根据情况通过降低验程度来保正常访问,例如:
复制代码代码如下:
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);//信任任何**
curl_setopt($ch,CURLOPT_SSL_VERIFYh**OST,1);//检查**中是否设置域名(为0也可以,就是连域名存在与否都不验了)

平时我们使用浏览器访问各个https网站时,有时会遇到**不受信的提示,其实就是因为这些网站的**不是正规CA机构颁布的。

市面上各种浏览器中都内置了CA根**列表信息,访问有CA颁布**的网站时,会根据根**验这些网站的**,所以就不会有这个提示了。

关于CA根**文件,其实就是包含了各个主要CA机构的公钥**,用来验网站的**是否是这些机构颁发的。

这里的这个文件是来源于mozilla的源码树,又转换成PEM格式**文件。(大家可以到这里下载现成的http://curl.***.se/ca/cacert.pem)

最后说一个和SSL无关的东西:
复制代码代码如下:
curl_setopt($ch,CURLOPT_h**TTPh**EADER,array('Expect:'));

这个主要是为了解决POST时**过长问题