Apache SNI 配置发送握手警报:unrecognized_name

Apache SNI 配置发送握手警报:unrecognized_name

我正在尝试解决几年前由于服务器配置错误而导致的问题

“握手警报:无法识别的名称”

当启用 SNI 的客户端(对于 Java 1.7 或更高版本的客户端)在握手期间发送

扩展 server_name,server_name:[type=host_name (0),value=hostname]

例如这个问题是如何避免这种情况:

https://stackoverflow.com/questions/7615645/ssl-handshake-alert-unrecognized-name-error-since-upgrade-to-java-1-7-0

我的 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 和一些更早的版本开始就已开始删除发送的警报。更多信息请见以下链接。

https://bz.apache.org/bugzilla/show_bug.cgi?id=56241

相关内容