匹配Perl中的PHP套接字SSL选项

时间:2012-03-24 01:27:52

标签: php perl ssl ssl-certificate

背景:

在处理第三方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::UserAgentNet::SSL)。我一直在使用Crypt::SSLeay来确定是否正在读取证书,它看起来就像是。但是,我不确定strace是否成功从PEM读取密钥。

问题:

我需要哪些特定的Net::SSL参数才能匹配PHP代码的行为?

注意:

  • $ua->ssl_opts()是包含
      的PEM文件的完整路径
    • 我们的“客户”证书 - 由第三方签发
    • 我们的加密(RSA)私钥 - 由第三方发布

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

  • 正在寻找有关私钥明文性质的安全建议。

2 个答案:

答案 0 :(得分:2)

这里有SSL伪专家。通过您的问题和both docs,这里似乎有平价:

  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

  5. 您还需要设置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';