在一些PHP代码处理与第三方Web服务,下面的代码工作:
// 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()
方法LWP::UserAgent
将正确的选项传递给Net::SSL
(Crypt::SSLeay
)。我一直在使用strace
来确定是否正在读取证书,看起来像是这样。但是,我不确定Net::SSL
是否成功地从PEM读取密钥。
问:
我需要什么具体的$ua->ssl_opts()
参数相匹配的PHP代码的行为?
注:
$data['cert']
是完整路径包含- 我们的 “客户” 证书PEM文件 - 由第三方
- 我们非 -encrypted(RSA)私钥发行 - 由第三方发行
$data['cafile']
是自签名证书的完整路径 - 由第三方发行- 我是不是正在寻找关于私钥明文性质的安全建议。
感谢您的关注 - 我在这里疯狂:-)我会尝试设置这些选项,但它们看起来非常接近没有工作的示例。如果我能合理地调试SSL库本身,我可以自己弄清楚。 – 2012-03-28 08:33:16
好吧,我会接受你的答案,然后询问另一个相关的在Perl中调试SSL。 – 2012-03-28 08:34:03
还不能给予奖励 - 不会让我 - “没有得到足够的关注”。 – 2012-03-28 08:36:00