尽管 SNI 服务器名称和主机名相同,但使用 TLSv1.2 仍获取 AH02032,但 SNI 已附加端口号。使用 TLSv1.3 的测试环境中没有错误

尽管 SNI 服务器名称和主机名相同,但使用 TLSv1.2 仍获取 AH02032,但 SNI 已附加端口号。使用 TLSv1.3 的测试环境中没有错误

尽管主机名相同,但仍收到以下错误消息。我不明白为什么通过 SNI 提供的主机名附带端口号,尽管根据主机名规范,冒号和端口号未列为主机名定义的一部分,并且 OpenSSL SNI 扩展将服务器名称视为主机名。这是 Apache(和 Wireshark)中的解析错误吗?

在客户端 hello 和 SNI 扩展下的 TLSv1.2 期间使用 Wireshark 列表查看 Debian 客户端的 tcp 转储:

服务器名称类型:Host_Name (0)服务器名称:MyHostname:443

虽然客户端允许 TLSv1.3,但服务器似乎在客户端 Hello 期间强制使用 TLSv1.2。

该请求使用 OpenSSL 3.07 cmp 发出

错误信息: AH02032:通过 SNI 提供的主机名 MyHostname:443 和通过 HTTP 提供的主机名 MyHostname 没有兼容的 SSL 设置 uri="path"

我希望当 Apache/SNI 解析该包时,服务器名称不带端口,并与 http 标头中的主机名进行比较,并被识别为相同。

在类似但不完全相同的生产环境中,当使用 TLSv1.3 时,如果客户端设置相同,则不会发生错误。

(我无法访问作为 Web 应用程序防火墙一部分的 Apache 服务器。)

修正案:

cmd:bin/openssl cmp -config etc/openssl.cnf -cmd ir -section cmp-init -ref [ref] -secret pass:[pass]-certout ssl/PKIstore/[store.pem] -newkey ssl/PKIstore/[new.key] -subject [SUBJECT DN] -implicit_confirm

openssl.cnf [默认] [cmp] [cmp-init] prompt = no 收件人 = [ca-dn] 路径 = [路径] tls_host = MyHostname tls_used = yes 服务器 = MyHostname:443 路径 = [默认路径] trust = [trusted.pem] cacertsout = [capubs.pem]

注意:server、tls_host 和 tls_used 的值在 opensssl.cfg 文件中定义。

进一步调查该数据包后:

无论给出什么服务器 = [值] 值最终为 server_name 扩展中的服务器名称。长度值包括前缀的长度https://前缀或端口:443如果给出的是服务器值。 [前缀][服务器值][:端口]

如果使用前缀或后缀,服务器名称将与主机标头中的服务器名称不匹配。如果仅提供服务器,则请求将发送到默认端口 80,即使 tls_used 设置为 yes。

由于 SNI 服务器名称类型是 host_name,我认为它不应包含协议前缀和端口。

答案1

对我来说,这看起来像是 OpenSSL 中的一个错误,我已将其归档如下:https://github.com/openssl/openssl/issues/20031

相关内容