PHP客户端验证https证书

3
我需要创建一个PHP客户端,并使用一些HTTPS下的Web服务。我的问题是,我还想验证服务器证书。我需要知道我连接的是正确的服务器,而不是中间人攻击。请问有没有人能帮助我呢?
谢谢!

这是一个不错的步骤,但检查中间人攻击并没有什么用。搜索“Diginotar”以了解为什么整个SSL CA系统基本上已经崩溃。 - Marc B
3
@Marc B: 我并不完全不同意你的观点,但我想指出,如果你尽可能地缩短受信任证书颁发机构(CA)列表,就可以在实践中避免许多问题。例如,在这种情况下,你实际上没有必要信任除连接到的网站所使用的特定CA以外的任何CA。 - Ilmari Karonen
2个回答

6
如果您已安装curl扩展,可以配置它在连接时验证证书。 http://php.net/manual/zh/function.curl-setopt.php
// 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中间证书和扩展验证证书的指南。您可以通过以上链接访问详细的步骤和说明。

谢谢!抱歉问一个愚蠢的问题。但我不知道如何测试一个URL或者作为Web服务客户端使用。我真的很新在PHP中。 :) - Ben Laniado
如果服务器未提供由ca_bundle.crt中的任一CA签名的有效证书,则连接将失败。 - rrehbein
感谢您的帮助!但是,第一次和第二次调用仍然没有发出任何警告。当我执行“var_dump($page)”时,我得到布尔值false。请帮忙... :) 之后我该如何调用服务器函数?(例如,像soap客户端那样?) - Ben Laniado
1
请注意上述代码中的一个错误:CURLOPT_SSL_VERIFYHOST 应该是一个整数参数,并且应该设置为 2(默认值)。有关更多详细信息,请参见 http://www.php.net/manual/en/function.curl-setopt.php。如果您将该值设置为 true,则实际上是禁用主机检查,从而启用 MITM 攻击! - simpleigh
@LeighSimpson 谢谢。已编辑答案进行更正。 - rrehbein

0

从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起。


CURLOPT_SSL_VERIFYHOST
1表示检查SSL对等证书中是否存在公共名称。2表示检查公共名称的存在,并验证它是否与提供的主机名匹配。在生产环境中,此选项的值应保持为2(默认值)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接