【问题标题】:perl - Net::SSLeay and Server Name Indicationsperl - Net::SSLeay 和服务器名称指示
【发布时间】:2021-05-14 15:44:35
【问题描述】:

您好,我友好的 stackoverflow 用户,

我有以下代码“应该”打印出“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 需要)标头。”

我不确定这是否与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 标头,但仍然是相同的不需要的结果。

所以我有点迷茫,我是菜鸟,所以我知道stackoverflow上的人以友善着称,也许你们都可以给我一些指点

【问题讨论】:

  • 你得到什么输出?与您的预期有何不同?
  • 我按预期得到了.pem,但是当我使用openssl x509 -in test.pem -text 阅读时,它不是我在网络浏览器中验证的“cyclingnews.com”证书。我认为这是托管许多虚拟域的网络服务器的默认网站证书,因为它显示在 Common Name 信息中。
  • @senorbrownie:不幸的是,您想要的东西根本不被支持。该功能不在代码中(特别是:https_cat 中不支持 SNI)。您没有做错任何事情或错过任何事情。如果您需要轻松访问 SNI 功能,请使用 IO::Socket::SSL。
  • @Steffen Ullrich,谢谢你,现在我知道了。如果您可以将其转换为答案,那么我可以关闭它。

标签: perl sni


【解决方案1】:

get_https3 和许多类似的函数一样,最终会在https_cat 中完成 SSL 上下文设置和 SSL 握手。不幸的是,在这个 really old part of the code 中没有设置 server_name 扩展 (SNI),这是因为 SNI 并不是像今天那样主要用于使用 HTTPS。

【讨论】:

    猜你喜欢
    • 2011-06-08
    • 2017-05-23
    • 1970-01-01
    • 2013-06-16
    • 2018-11-27
    • 2015-01-31
    • 2013-03-05
    • 2012-09-03
    • 1970-01-01
    相关资源
    最近更新 更多