php - 在 Perl 中匹配 PHP 套接字 SSL 选项

标签 php perl ssl ssl-certificate

背景:

在一些处理第 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 ,这里似乎有奇偶校验:

  1. 'local_cert'

    SSL_cert_file。来自 here .

  2. 'verify_peer'

    验证主机名。来自 herehere , 再次。

  3. 'allow_self_signed'

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

  4. 'cafile'

    SSL_ca_file。同样来自 here .

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

关于php - 在 Perl 中匹配 PHP 套接字 SSL 选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9848359/

相关文章:

c# - .net 4.5.2 和 SSL 3.0

api - twitter4j getOAuthRequestToken错误

php - 使用 PHP 将 JSON 信息发送到数据库?

php 使用另一个 php 配置的模板文件?

perl - 如何使用 Perl 读取文件中两行之间的所有行?

Perl:如何深度复制受祝福的对象?

selenium - Selenium 的最小 perl 脚本是什么?

c - 如果用户没有在他的计算机上安装/信任我的私有(private) CA,则从服务器端检测

php - 每当我使用 $_GET 获取数据库中的特定行时,jquery/JS 什么都不做

php - mySQL表链接,组链接到其他成员列表,显示所有成员