23

我正在为 Apache 设置几个不同的 SSL 证书,这些证书用于驻留在同一服务器上的不同域(因此共享相同的 IP 地址)。

通过Qualys SSL 测试,我发现有些客户端(即BingBot 截至 2013 年 12 月)不支持 SNI 扩展。

所以我正在考虑制作一个可以收集此类客户端请求的特殊默认 Web 应用程序,但我该如何模拟这些客户端呢?

如果这很重要,我在 Windows 8 上,无法访问 Linux 机器。

4

6 回答 6

28

您可以使用最常用的 SSL 库 OpenSSL。Windows 二进制文件可供下载。

openssl s_client -connect domain.com:443命令非常适合从客户端测试 SSL 连接。默认不支持 SNI。您可以附加-servername domain.com参数以启用 SNI。

于 2015-02-03T11:24:10.343 回答
7

如果您使用的是 OpenSSL 1.1.0 或更早版本,请使用openssl s_client -connect $ip:$port,OpenSSL 不会启用 SNI 扩展

如果您使用的是 OpenSSL 1.1.1,则需要将-noservername标志添加到openssl s_client.

于 2018-06-09T04:19:22.037 回答
5

与 openssl s_client 类似的是 gnutls-cli

gnutls-cli --disable-sni www.google.com
于 2017-06-15T10:58:29.820 回答
1

您可以安装Strawberry Perl,然后使用以下脚本模拟不支持 SNI 的客户端:

use strict;
use warnings;
use LWP::UserAgent;

my $ua = LWP::UserAgent->new(ssl_opts => {
    # this disables SNI
    SSL_hostname => '', 
    # These disable certificate verification, so that we get a connection even
    # if the certificate does not match the requested host or is invalid.
    # Do not use in production code !!!
    SSL_verify_mode => 0,
    verify_hostname => 0,
});

# request some data
my $res = $ua->get('https://example.com');

# show headers
# pseudo header Client-SSL-Cert-Subject gives information about the
# peers certificate
print $res->headers_as_string;

# show response including header
# print $res->as_string;

通过将 SSL_hostname 设置为空字符串,您可以禁用 SNI,禁用此行会再次启用 SNI。

于 2015-02-03T11:03:18.300 回答
1

使用特殊的默认 Web 应用程序的方法根本行不通。

你不能这样做,因为所说的受限客户端不仅打开了不同的页面,而且完全失败了。

  1. 考虑您有一个“默认”虚拟主机,非 SNI 客户端可以正常打开该虚拟主机。

  2. 您还有一个额外的虚拟主机,它应该由支持 SNI 的客户端打开。

  3. 显然,这两个必须有不同的主机名(例如,default.example.comwww.example.com),否则 Apache 或 nginx 将不知道要显示哪个站点到哪个连接客户端。

现在,如果非 SNI 客户端尝试打开https://www.example.com,他将收到来自 的证书default.example.com,这会给他一个证书错误。这是一个主要的警告。

www.example.com解决此错误的方法是制作一个包含和的 SAN(多域)证书default.example.com。然后,如果一个非 SNI 客户端尝试打开https://www.example.com,他将获得一个有效的证书,但即便如此,他的Host:标头仍将指向www.example.com,并且他的请求将被路由到default.example.com而不是路由到www.example.com

如您所见,您要么完全阻止非 SNI 客户端,要么将它们转发到预期的虚拟主机。默认 Web 应用程序没有明智的选择。

于 2016-12-31T04:57:14.540 回答
0

使用 Java HTTP 客户端,您可以通过设置系统属性来禁用 SNI 扩展jsse.enableSNIExtension=false

更多信息:Java TLS:在客户端握手时禁用 SNI

于 2020-09-23T12:40:14.823 回答