【发布时间】: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,谢谢你,现在我知道了。如果您可以将其转换为答案,那么我可以关闭它。