php访问https页面

By | 2012/02/10

只是访问一般的http页面的话,可以通过file、file_get_contents、stream_系列函数实现,个人觉得比较好用的类有Snoopy class及dede自带的dedehttpdown class,都比较好用。可当需要访问https的内容时,这些函数及类就无能为力了,采用ssl导致协议的变化不是这么简单就能搞定的。

在未深入探究的情况下,要访问https的内容,采用php的扩展curl是最好的办法了。如果服务器不支持这个扩展,可能真没有什么好的办法了。

不过即使采用了curl进行访问,相比平常情况也有几点需要注意的:

这里要特别注意两个值:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

一定要设置这两个值为false,这是关闭ssl的相关验证。不设置的话,表现为访问https的内容,没有任何反馈结果,甚至连header也不会得到。当然如果为了防止伪造需要验证的话,可以使用下面的配置:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch,CURLOPT_CAINFO,’/api/pay/boc/cacert.pem’);

其中cacert.pem可以到http://curl.haxx.se/ca/cacert.pem获取,这样就可以验证服务器的真实性了。

顺便再提一点,可能https协议这块都没有问题了,可是还是无法获取正确的结果,对方服务器返回值不正确。如果你也遇到这个情况,尝试使用urlencode对post的数据进行编码,很有可能就解决问题了。我在开发中就遇到了这样的问题,怎么检查也找不到原因。最后通过抓包发现我采用curl post的结果和浏览器的结果部分特殊字符不一样,采用编码后解决。

3 thoughts on “php访问https页面

  1. starsea

    请问下怎么抓包 我用winsock expert 抓curl的包抓不到啊

    Reply
    1. admin Post author

      应该可以抓到吧?注意https页面访问的端口是443.忘记当时怎么抓包了,我抓包一般使用WSExplorer和CommView Packet Analyzer,前者可以对某个程序抓包,后者就是常见的抓包工具。

      Reply

回复 starsea 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据