gpt4 book ai didi

perl - IO::Socket::SSL - 建立客户端连接

转载 作者:太空宇宙 更新时间:2023-11-03 13:00:05 25 4
gpt4 key购买 nike

根据 IO::Socket::SSL (PERL) 的文档,我了解到如果我只想将命令发送到在我主机上的端口 9999 上运行的特定服务器程序,我可以这样做:

my $cl=IO::Socket::SSL->new("localhost:9999"); # locallost is my real case, anyway
if($cl) {
$cl->connect_SSL or die $@;
# Something about certificates?
$cl->syswrite("Command");
close($cl);
}

但我得到的错误是:“SSL 连接尝试失败,出现未知错误错误:140770FC:SSL 例程:SSL23_GET_SERVER_HELLO:blabla.cgi 行 888 处的未知协议(protocol)”

服务器以这种方式初始化(​​在另一个 pl 程序中):

use IO::Socket::SSL;
use Net::WebSocket::Server;
my $CON={};
my @crt=&SSLCerts(); die 'E101' if(@crt==0);
my $ssl=IO::Socket::SSL->new(
Listen => 10000,
Timeout => 45,
LocalPort => 9999,
Proto => 'tcp',
SSL_cert_file => "$EF::Base/ssl/certs/$crt[0][0].crt",
SSL_key_file => "$EF::Base/ssl/keys/$crt[1][0].key"
) or die "E102: $!";

Net::WebSocket::Server->new(
listen => $ssl,
silence_max=> 3600,
tick_period => 5,
on_tick => sub {
# Empty for now
},
on_connect => sub {
my($serv,$conn)=@_; my($cid,$sid);
$conn->on(
handshake => sub {
my($cnc,$hdk)=@_;
my $nsn=$hdk->req->resource_name;
$cid=substr($nsn,4,index($nsn,'&L=')-4);
$CON->{$cid}=$cnc; # Register incomming connection
},
binary => sub {
# Handle incomming message from the client
},
disconnect => sub {
delete $CON->{$cid};
}
);
}
)->start;

通过“wss://”从浏览器连接的典型 Websocket 客户端连接没有任何问题....服务器必须是 SSL...

这里我只是想在 perl 中做同样的事情。

我做错了什么?客户端中没有提及证书,仅在服务器中提及 - 服务器工作正常。也许配置?我已经购买了 SSL 证书,并将它们用于在该端口上运行正常的服务器。主机是 Linux(CentOS - 如果重要的话)。

最佳答案

... SSL23_GET_SERVER_HELLO:unknown protocol

如果客户端尝试进行 SSL 握手并且服务器响应不是 SSL 的内容,就会出现这种错误。如果您连接到未(正确)启用 SSL(至少不在此端口上)或需要一些纯文本升级到 SSL(例如 SMTP STARTTLS 和类似的情况)的服务器,通常会发生这种情况。

这种错误通常与证书无关。

只有当您尝试在已建立的 SSL 套接字上进行 SSL 握手但服务器不希望发生这种情况时,才会发生这种错误。这似乎发生在你的情况下:

my $cl=IO::Socket::SSL->new("localhost:9999"); # locallost is my real case, anyway
if($cl) {
$cl->connect_SSL or die $@;
...

IO::Socket::SSL->new 已经建立了 SSL 连接。这与 IO::Socket::INET 或类似的相同:如果给定目标,它将已经在 new 和附加的 connectconnect_SSL< 内连接 不应该这样做。这也反射(reflect)了in the documentation和例子。

自版本 2.045(02/2017 发布)以来,如果 SSL 握手已经完成,IO::Socket::SSL 将简单地忽略 connect_SSL。您可能使用旧版本的 IO::Socket::SSL,其中 connect_SSL 将开始新的握手,即使 TLS 握手已经完成。 TLS 连接内的这种握手将导致您看到的奇怪错误。

关于perl - IO::Socket::SSL - 建立客户端连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54283355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com