这里是打开一个SSL套接字准备发送HTTP请求一个简单的PHP脚本:
$contextOptions = array(); $socketUrl = 'ssl://google.com:443'; $streamContext = stream_context_create($contextOptions); $socket = stream_socket_client($socketUrl, $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $streamContext); if (!$socket || $errno !== 0) { var_dump($socket, $errstr); exit; } var_dump($socket); exit('Socket created.');
这工作 - 我只是测试它 - 但有对信任的CA存储任何验证。
我们可以修改脚本,以使用PHP的SSL上下文选项 :
$contextOptions = array( 'ssl' => array( 'cafile' => 'C:\xampp\cacerts.pem', 'CN_match' => '*.google.com', // CN_match will only be checked if 'verify_peer' is set to TRUE. See https://bugs.php.net/bug.php?id=47030. 'verify_peer' => TRUE, ) ); $socketUrl = 'ssl://google.com:443'; $streamContext = stream_context_create($contextOptions); $socket = stream_socket_client($socketUrl, $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $streamContext); if (!$socket || $errno !== 0) { var_dump($socket, $errstr); exit; } var_dump($socket); exit('Socket created.');
只要“凭证档案错误”存在并具有正确的CA那么这个例子也适用...
......但我们怎样才能做到这一点没有硬编码CA文件名/文件路径? 我们正在努力创造的东西,OS-独立验证SSL证书,而无需为运行该脚本的每个服务器单独配置。
我知道,Linux有,我们可以把作为“capath” CA的目录。 什么有关Windows? 它在哪里存储其信任的CA? 我搜索,这些不幸的是似乎是在注册表中,所以是有没有办法,我们可以从PHP访问它们? 那么其他的操作系统?