【发布时间】:2019-01-21 04:01:25
【问题描述】:
根据 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 行的未知协议”
服务器以这种方式初始化(在另一个 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 - 如果重要的话)。
【问题讨论】:
-
您确定服务器是 SSL 服务器吗?
-
您的“与连接管理有关的员工”是否包括
'listen' => $ssl? -
请提供一个足够完整的示例,该示例实际上显示了 SSL 在服务器端的使用方式(即 # Staff to do with connections management 中的魔法)。除此之外:WebSockets 不是相同的套接字,即要与 WebSockets 服务器通信,您需要使用 WebSockets 协议,而不仅仅是普通的 TCP 或 SSL。
-
我在连接管理器中添加了这些东西 - 但我认为它不会影响连接客户端。