perl - Net::SSLeay 和服务器名称指示
perl - Net::SSLeay and Server Name Indications
你好我友好的 Whosebug 用户,
我有以下代码“应该”打印出 'cyclingnews.com'
的证书
#!/usr/bin/env perl
use strict;
use Net::SSLeay qw(get_https get_https3 make_headers);
my $site = "cyclingnews.com";
my ($p, $resp, $headers, $server_cert) = get_https3($site, 443, '/');
print "$headers\n";
my $PEM = Net::SSLeay::PEM_get_string_X509( $server_cert);
print $PEM, "\n";
检查 .pem
后,我发现该证书属于:
Subject: CN = *.ssl.hwcdn.net
X509v3 Subject Alternative Name:
DNS:*.ssl.hwcdn.net, DNS:ssl.hwcdn.net
据我了解,这看起来像是 SNI
的问题,其中 Net::SSLeay
没有将 SSL_hostname
传递给 'cyclingnews.com'。使用 IO::SOCKETS::SSL
可以使用 SSL_hostname
( https://metacpan.org/pod/IO::Socket::SSL#Basic-SSL-Client )
Net::SSLeay
文档 (https://metacpan.org/pod/Net::SSLeay#Basic-set-of-functions) 说“默认情况下 get_https()
提供 Host
(使虚拟主机更容易)和 Accept
(据报道需要通过 IIS) headers."
我不确定这是否与 get_https3()
有关,所以我也尝试过:
#!/usr/bin/env perl
use strict;
use Net::SSLeay qw(get_https get_https3 make_headers);
my $site = "cyclingnews.com";
my ($p, $resp, $headers, $server_cert) = get_https3($site, 443, '/',
make_headers( 'Host:' => $site));
#);
print "$headers\n";
my $PEM = Net::SSLeay::PEM_get_string_X509( $server_cert);
print $PEM, "\n";
这看起来通过了 Host
header 但仍然是不想要的结果。
所以我有点迷茫,我是菜鸟,所以我知道 Whosebug 上的人以友好着称,也许你们可以给我一些建议
get_https3 like many similar functions ultimately ends up in https_cat where the SSL context setup and the SSL handshake are done. Unfortunately, setting the server_name
extension (SNI) is not done in this really old part of the code,它来自 SNI 不像今天那样主要用于使用 HTTPS 的时代。
你好我友好的 Whosebug 用户,
我有以下代码“应该”打印出 'cyclingnews.com'
的证书#!/usr/bin/env perl
use strict;
use Net::SSLeay qw(get_https get_https3 make_headers);
my $site = "cyclingnews.com";
my ($p, $resp, $headers, $server_cert) = get_https3($site, 443, '/');
print "$headers\n";
my $PEM = Net::SSLeay::PEM_get_string_X509( $server_cert);
print $PEM, "\n";
检查 .pem
后,我发现该证书属于:
Subject: CN = *.ssl.hwcdn.net
X509v3 Subject Alternative Name:
DNS:*.ssl.hwcdn.net, DNS:ssl.hwcdn.net
据我了解,这看起来像是 SNI
的问题,其中 Net::SSLeay
没有将 SSL_hostname
传递给 'cyclingnews.com'。使用 IO::SOCKETS::SSL
可以使用 SSL_hostname
( https://metacpan.org/pod/IO::Socket::SSL#Basic-SSL-Client )
Net::SSLeay
文档 (https://metacpan.org/pod/Net::SSLeay#Basic-set-of-functions) 说“默认情况下 get_https()
提供 Host
(使虚拟主机更容易)和 Accept
(据报道需要通过 IIS) headers."
我不确定这是否与 get_https3()
有关,所以我也尝试过:
#!/usr/bin/env perl
use strict;
use Net::SSLeay qw(get_https get_https3 make_headers);
my $site = "cyclingnews.com";
my ($p, $resp, $headers, $server_cert) = get_https3($site, 443, '/',
make_headers( 'Host:' => $site));
#);
print "$headers\n";
my $PEM = Net::SSLeay::PEM_get_string_X509( $server_cert);
print $PEM, "\n";
这看起来通过了 Host
header 但仍然是不想要的结果。
所以我有点迷茫,我是菜鸟,所以我知道 Whosebug 上的人以友好着称,也许你们可以给我一些建议
get_https3 like many similar functions ultimately ends up in https_cat where the SSL context setup and the SSL handshake are done. Unfortunately, setting the server_name
extension (SNI) is not done in this really old part of the code,它来自 SNI 不像今天那样主要用于使用 HTTPS 的时代。