2012-03-24 22 views
1

背景:在Perl匹配PHP的SSL套接字选项

在一些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::SSLCrypt::SSLeay)。我一直在使用strace来确定是否正在读取证书,看起来像是这样。但是,我不确定Net::SSL是否成功地从PEM读取密钥。

问:

我需要什么具体的$ua->ssl_opts()参数相匹配的PHP代码的行为?

注:

  • $data['cert']是完整路径包含
    • 我们的 “客户” 证书PEM文件 - 由第三方
    • 我们 -encrypted(RSA)私钥发行 - 由第三方发行

  • $data['cafile']是自签名证书的完整路径 - 由第三方发行

  • 我是不是正在寻找关于私钥明文性质的安全建议。

回答

2

SSL伪专家在这里。通过你的问题,bothdocs去,这里就是好像有奇偶校验:

  1. 'local_cert'

    SSL_cert_file。从here

  2. 'verify_peer'

    verify_hostname。再次从herehere

  3. 'allow_self_signed'

    无奇偶校验。然而,这个选项是没有实际意义,因为you required verify_peer for that in the first place.

  4. 'cafile'

    SSL_ca_file。也从here

您还需要设置SSL_version以支持您对SSLv3的需求。而且,似乎是这样。

+0

感谢您的关注 - 我在这里疯狂:-)我会尝试设置这些选项,但它们看起来非常接近没有工作的示例。如果我能合理地调试SSL库本身,我可以自己弄清楚。 – 2012-03-28 08:33:16

+1

好吧,我会接受你的答案,然后询问另一个相关的在Perl中调试SSL。 – 2012-03-28 08:34:03

+0

还不能给予奖励 - 不会让我 - “没有得到足够的关注”。 – 2012-03-28 08:36:00

0

Crypt :: SSLeay模块中有一个测试文件,可以测试您的证书/ SSL连接。

的Perl如/净SSL测试-cert =证书/ notacacert.pem - 键=证书/ notacakeynopass.pem -CAfile your_ca_file.ca -d GET test_url

你可以使用ENV瓦尔设置文件/路径:

来自: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'; 
+0

这只是来自Crypt :: SSLeay手册页的示例。这实际上是我尝试的第一件事。以上解释中需要注意的一些事项 - (1)有第三方签署CA,密钥位于同一个PEM中,(2)不应出现远程主机名验证。 – 2012-03-27 13:13:59

+0

我正在使用$ ua-> ssl_opts(),因为环境变量是不受欢迎的(全局读取) - 即使当_local_ize环境更改时它们也会泄漏。 – 2012-03-27 13:15:37

+0

此外,我做了strace - 我没有看到正在读取的KEY文件。 – 2012-03-27 13:17:42