背景:
在一些处理第 3 方网络服务的 PHP 代码中,以下代码有效:
// connect to web-service
$remote_addr = "tcp://{$data['ip']}:{$data['port']}";
$socket = stream_socket_client($remote_addr, $errno, $errstr, 30);
if (!$socket) throw "Couldn't create socket: $errstr\n";
// configure SSL options on socket
stream_context_set_option($socket, 'ssl', 'local_cert', $data['cert']);
stream_context_set_option($socket, 'ssl', 'verify_peer', false);
stream_context_set_option($socket, 'ssl', 'allow_self_signed', true);
stream_context_set_option($socket, 'ssl', 'cafile', $data['cafile']);
// do SSL handshake
stream_set_blocking ($socket, true);
stream_socket_enable_crypto ($socket, true, STREAM_CRYPTO_METHOD_SSLv3_CLIENT);
stream_set_blocking ($socket, false);
//... start talking HTTP
我们继续将此 PHP 代码包装在我们自己的 JSON-RPC 网络服务中,以便从用 Perl 编写的内部管理系统调用它。
在分析这个“解决方案”时,我发现我可以通过删除 Perl-PHP(通过 HTTP)间接访问来极大地提高性能。我已尝试将代码移植到 Perl,但遇到了与 SSL 选项匹配的问题。
我正在使用 LWP::UserAgent
的 $ua->ssl_opts()
方法将正确的选项传递给 Net::SSL
(Crypt::SSLeay
)。我一直在使用 strace
来确定是否正在读取证书,看起来确实如此。但是,我不确定 Net::SSL
是否成功从 PEM 读取 key 。
问题:
我需要哪些特定的 $ua->ssl_opts()
参数来匹配 PHP 代码的行为?
注释:
$data['cert']
是包含- 的PEM文件的完整路径
- 我们的“客户”证书 - 由第 3 方颁发
- 我们的非加密 (RSA) 私钥 - 由第 3 方颁发
$data['cafile']
是自签名证书的完整路径 - 由第 3 方颁发- 我不是寻找有关私钥明文性质的安全建议。
最佳答案
这里是 SSL 伪专家。通过你的问题和both docs ,这里似乎有奇偶校验:
'local_cert'
SSL_cert_file。来自 here .
'verify_peer'
'allow_self_signed'
没有奇偶校验。但是,这个选项没有实际意义,因为 you required
verify_peer
for that in the first place.'cafile'
SSL_ca_file。同样来自 here .
您还需要设置 SSL_version支持您对 SSLv3 的需求。而且,似乎就是这样。
关于php - 在 Perl 中匹配 PHP 套接字 SSL 选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9848359/