我正在尝试解决几年前由于服务器配置错误而导致的问题
“握手警报:无法识别的名称”
当启用 SNI 的客户端(对于 Java 1.7 或更高版本的客户端)在握手期间发送
扩展 server_name,server_name:[type=host_name (0),value=hostname]
例如这个问题是如何避免这种情况:
我的 apache 版本是 2.4.33,在 Ubuntu 16.04 上。我使用的配置文件如下所示:
<IfModule ssl_module>
Listen 8095
</IfModule>
<IfModule mod_gnutls.c>
Listen 8095
</IfModule>
ServerName localhost
<IfModule mod_ssl.c>
<VirtualHost _default_:8095>
ServerName value.that.does.not.match.the.cn.in.certificate
ServerAlias value.that.does.not.match.the.cn.in.certificate
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /path_to_certificates/selfsigned.cert
SSLCertificateKeyFile /path_to_certificates/selfsigned.key
SSLVerifyClient none
SSLVerifyDepth 10
</VirtualHost>
</IfModule>
我做了一些研究,并使用以下命令检查通过 apache 公开的主机名是否启用了 SNI:
openssl s_client -servername hostanametocheck -tlsextdebug -connect hostanametocheck:8095 2>/dev/null | grep "server name"
其结果是:
TLS server extension "server name" (id=0), len=0
从我所读的内容来看,这表明 apache 在握手期间发送了此扩展,如果 Java 客户端 > 1.7,则在握手期间会出现异常。
我原本以为我的 Java 客户端 (1.8) 会收到该警报,并且握手会失败,但当我到达这里时,情况并非如此。我已经花了相当多的时间来弄清楚这一点,但看起来这超出了我的网络和 Linux 知识范围。
顺便说一句,我在开发机器上运行 Apache,因此端口是 8095,而不是 443。我将主机名映射到本地主机。客户端启用了 SNI,因为我可以在握手日志中看到扩展已发送
Extension server_name, server_name: [type=host_name (0), value=hostname.that.does.not.match.cn.in.certificate.com]
非常感谢您的帮助!
答案1
我成功地用 Apache 2.2.22(但有些旧版本未打补丁)引发了错误,因为看起来他们从 2.4.1 和一些更早的版本开始就已开始删除发送的警报。更多信息请见以下链接。