【问题标题】:perl IO::Socket::SSL SSL connect attempt failedperl IO::Socket::SSL SSL 连接尝试失败
【发布时间】:2020-09-14 04:55:45
【问题描述】:

在我启动 io::socket::ssl tls 连接时

我的示例适用于 google 和 facebook,但不适用于 sip tls 服务器

那是 sip tls 服务器

我无法跳过证书

#/usr/bin/perl
use IO::Socket::SSL;

start_connection("2.50.44.55:5061");

sub start_connection{
    my @parms = @_;
    my $host  = $parms[0];
 
    my $sock = IO::Socket::SSL->new(
        PeerAddr => $host,
        SSL_startHandshake => 0,
    ) or die $!;
    $sock->connect_SSL() or die $SSL_ERROR;
    print "Good Connection"
}

在我设置连接时我有这个错误

SSL 连接尝试失败错误:14090086:SSL 例程:ssl3_get_server_certificate:certificate verify failed at dd.pl line 14

【问题讨论】:

  • 请访问以下web page
  • @PolarBear 我的例子,它适用于 google 和 facebook,但不适用于 sip tls 服务器
  • 您的 SIP 服务器是否有有效的 SSL 证书?
  • @PolarBear 服务器与其他 c# 程序一起使用 .. 但不适用于我的 perl 套接字程序
  • Perl 尝试验证服务器 SSL 证书,但由于某种原因验证失败。如果你有自签名证书,那么你需要将它提供给你的 perl 脚本,否则它不能使用它。如果您从受信任的 CA 获得证书,那么问题应该不会出现。

标签: perl sockets ssl


【解决方案1】:

您在此处使用的是自签名证书。 IO::Socket::SSL 默认检查证书是否可信,除非客户端明确知道,否则自签名证书不可信。虽然您可以简单地禁用证书验证,但这基本上会禁用任何有意义的安全性,因为中间人攻击者可以冒充真实服务器而客户端没有注意到它。

最好的方法可能是获得由公众信任的 CA 签署的证书,例如 Let's Encrypt。如果您坚持使用自签名证书,尽管您可能会通过使用 SSL_fingerprint 选项特别信任此证书。

获取必要的证书指纹:

 $ echo | openssl s_client -connect 2.50.44.55:5061 |\
    openssl x509 -noout -fingerprint
 ...
 SHA1 Fingerprint=CE:68:62:68:30:EA:F4:64:82:F5:5C:B7:FB:F4:DA:1B:77:88:9F:DD

然后将此指纹与 IO::Socket::SSL 一起使用

my $sock = IO::Socket::SSL->new(
    PeerAddr => '2.50.44.55:5061',
    SSL_fingerprint => 'sha1$CE68626830EAF46482F55CB7FBF4DA1B77889FDD'
) or die $SSL_ERROR;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-21
    • 2011-02-21
    • 1970-01-01
    • 2014-12-25
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    相关资源
    最近更新 更多