pb1*_*149 5 php linux windows ssl ssl-certificate
这是一个简单的PHP脚本,可以打开SSL套接字,准备发送HTTP请求:
$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 Context选项:
$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.');
只要'cafile'存在且具有正确的CA,那么这个例子也有效......
...但是如果不对CA文件名/文件路径进行硬编码,我们怎么能这样做呢?我们正在尝试创建一些可独立于OS验证SSL证书的内容,而无需为运行此脚本的每个服务器单独配置.
我知道Linux有一个CA目录,我们可以把它作为'capath'.Windows怎么样?它在哪里存储其可信任的CA?我搜索过,遗憾的是这些似乎都在注册表中,所以我们无法从PHP访问它们吗?其他操作系统怎么样?
rdl*_*rey 13
一场失败的战斗......
如果不在PHP 5.6之前手动设置"cafile"和"CN_match"上下文选项,就无法在PHP中进行安全的加密传输.而不幸的是,即使你做正确设置这些值的转让仍然很可能失败,因为验证主机名时前5.6版本不征询日益流行的SAN(SubjectAltName)扩展目前在同行证书.因此,通过PHP的内置流包装器进行"安全"加密在很大程度上是一种误称.使用旧版PHP的最安全的赌注(字面意思)是卷曲扩展.
关于Windows证书......
Windows使用自己的证书存储区,并以不同的格式从OpenSSL对其证书进行编码.相比之下,openssl应用程序使用开放的.PEM格式.5.6之前的PHP版本无法以任何方式与Windows证书库进行交互.因此,使用内置流包装器功能以跨操作系统方式进行可靠和安全的加密是不可能的.
新的openssl.cafile和openssl.capath php.ini指令允许您全局分配证书位置,而无需在每个流上下文中设置它们
默认情况下,所有加密流都会验证对等证书和主机名,如果未"CN_match"提供上下文选项,则会自动从URI中解析主机名.
流加密操作现在在验证主机名时检查对等证书SAN条目
如果在流上下文或 php.ini指令中没有指定CA文件/路径,PHP会自动回退到操作系统的证书库(在Windows中也是如此!)
举个例子,这就是你需要做的就是在PHP-5.6中安全地连接到github.com:
<?php
$socket = stream_socket_client("tls://github.com:443");
Run Code Online (Sandbox Code Playgroud)
是.真的就是这样.没有关于上下文设置和验证参数的烦恼.在这方面,PHP现在的功能就像浏览器一样.
更多关于这个主题的阅读
这些PHP 5.6更改只是关于SSL/TLS改进的冰山一角.我们努力使5.6成为迄今为止加密通信方面最安全的PHP版本.
如果您想了解有关这些新功能的更多信息,可通过官方渠道获取大量信息
关于SAN匹配的说明5.4/5.5
我们正努力至少向SAN端口支持与5.4和5.5分支的匹配,因为在没有此功能的情况下以任何有意义的方式(作为客户端)使用加密包装器是极其困难的.虽然这种向后移植工作在很大程度上取决于我作为志愿者的空闲时间,但提出这个答案肯定会帮助它尽快发生:)