我需要创建一个PHP客户端,并使用一些HTTPS下的Web服务。我的问题是,我还想验证服务器证书。我需要知道我连接的是正确的服务器,而不是中间人攻击。请问有没有人能帮助我呢?
谢谢!
谢谢!
// As of writing this, Twitter uses Verisign, Google uses Eqifax
$exampleUrl = 'https://twitter.com/'; // Success
$exampleUrl = 'https://google.com/'; // Fails
// create a new CURL resource
$ch = curl_init($exampleUrl);
// enable verification
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
// list of CAs to trust
// If the remote site has a specific CA, they usually have a .crt
// file on their site you can download. Or you can export key items from
// some browsers.
// In this example, using: Verisign [1]
curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . '/ca_bundle.crt');
// - or -
curl_setopt($ch, CURLOPT_CAPATH, __DIR__ . '/ca_certs/');
// If the remote site uses basic auth:
curl_setopt($ch, CURLOPT_USERPWD, $username . ':' . $password);
// And a helpful option to enable while debugging
//curl_setopt($ch, CURLOPT_VERBOSE, true);
// defaults to stdout, don't want that for this case.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$page = curl_exec($ch);
[1] http://www.verisign.com/support/verisign-intermediate-ca/extended-validation/apache/
这是关于在Apache服务器上安装Verisign中间证书和扩展验证证书的指南。您可以通过以上链接访问详细的步骤和说明。CURLOPT_SSL_VERIFYHOST
应该是一个整数参数,并且应该设置为 2(默认值)。有关更多详细信息,请参见 http://www.php.net/manual/en/function.curl-setopt.php。如果您将该值设置为 true
,则实际上是禁用主机检查,从而启用 MITM 攻击! - simpleigh从Curl 7.10开始,似乎现在默认已经设置好检查了:
http://php.net/manual/en/function.curl-setopt.php
CURLOPT_SSL_VERIFYPEER
将其设置为FALSE,以停止cURL验证对等方的证书。可以使用CURLOPT_CAINFO选项指定要验证的备用证书,也可以使用CURLOPT_CAPATH选项指定证书目录。
默认情况下为TRUE,自cURL 7.10起。默认捆绑包已安装自cURL 7.10起。