根据IO::套接字::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 line 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;
典型的Websocket客户端通过“wss://”从浏览器连接,没有任何麻烦……服务器必须SSL…
在这里,我只是试图从perl中做同样的事情。
我做错了什么?没有提到客户端的证书,只有在服务器-服务器工作正常。也许配置?我已经购买了SSL证书,我将它们用于在该端口上运行正常的服务器。主机Linux(CentOS-如果重要的话)。
…SSL23_GET_SERVER_HELLO:未知协议
如果客户端尝试进行SSL握手,而服务器以不SSL的方式响应,则会出现这种错误。通常,如果您连接到未(正确)启用SSL的服务器(至少在此端口上未启用)或需要一些纯文本才能升级到SSL(如SMTPSTARTTLS等),就会发生这种情况。
这种错误通常与证书无关。
这种错误只有在您尝试在已经建立的SSL套接字上进行SSL握手但服务器不期望这种情况时才会发生。这似乎发生在您的情况下:
my $cl=IO::Socket::SSL->new("localhost:9999"); # locallost is my real case, anyway
if($cl) {
$cl->connect_SSL or die $@;
...
SSL连接已经通过建立IO::套接字::SSL-
从2.045版本(02/2017发布)开始IO::Socket::SSL将简单地忽略connect_SSL
,如果SSL握手已经完成。您可能使用旧版本的IO::Socket::SSL其中connect_SSL
将开始新的握手,即使TLS握手已经完成。TLS连接中的这种握手将导致您看到的奇怪错误。