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 的时代。