背景:
在处理第三方Web服务的一些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 Web服务中,以便从内部管理系统中调用它,用Perl编写。
在分析这个“解决方案”时,我发现通过删除Perl-PHP(通过HTTP)间接可以大大提高性能。我已经尝试将代码移植到Perl,但是遇到了与SSL选项匹配的问题。
我正在使用$ua->ssl_opts()
的{{1}}方法将正确的选项传递给LWP::UserAgent
(Net::SSL
)。我一直在使用Crypt::SSLeay
来确定是否正在读取证书,它看起来就像是。但是,我不确定strace
是否成功从PEM读取密钥。
问题:
我需要哪些特定的Net::SSL
参数才能匹配PHP代码的行为?
注意:
$ua->ssl_opts()
是包含$data['cert']
是自签名签名证书的完整路径 - 由第三方签发
答案 0 :(得分:2)
这里有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的需求。而且,似乎就是这样。
答案 1 :(得分:0)
Crypt :: SSLeay模块中有一个测试文件,您可以测试证书/ SSL连接。
perl eg / net-ssl-test -cert = certs / notacacert.pem -key = certs / notacakeynopass.pem -CAfile your_ca_file.ca -d GET test_url
您可以使用env vars来设置文件/路径:
来自:http://metacpan.org/pod/Crypt::SSLeay
# debugging (SSL diagnostics)
$ENV{HTTPS_DEBUG} = 1;
# default ssl version
$ENV{HTTPS_VERSION} = '3';
# client certificate support
$ENV{HTTPS_CERT_FILE} = 'certs/notacacert.pem';
$ENV{HTTPS_KEY_FILE} = 'certs/notacakeynopass.pem';