OpenSSL CMP请求TLSv1.2时SNI携带端口引发AH02032错误的问题咨询
各位好,我遇到了一个非常困惑的问题:明明HTTP头里的主机名和SNI传递的主机名本质是同一个,但Apache还是抛出了AH02032错误。核心疑问是SNI里的主机名居然附带了端口号:443——根据主机名规范,冒号和端口根本不属于主机名的组成部分,而且OpenSSL的SNI扩展也应该把服务器名当作纯主机名来处理才对。这会不会是Apache或者Wireshark的解析问题?
抓包与环境信息
我用Debian客户端抓包后,在TLSv1.2的Client Hello阶段,Wireshark显示SNI扩展的内容为:
Server Name Type: Host_Name (0)
Server Name: MyHostname:443
客户端本身支持TLSv1.3,但看起来服务器在Client Hello阶段强制使用了TLSv1.2。请求是通过OpenSSL 3.0.7的CMP命令发起的。
错误日志内容
AH02032: Hostname MyHostname:443 provided via SNI and Hostname MyHostname provided via HTTP have no compatible SSL setup uri="path"
我的预期是:Apache解析SNI时应该自动剥离端口号,和HTTP头里的主机名做匹配,这样就能识别为同一个主机名了。而且在一个类似但非生产的环境中,使用TLSv1.3就不会出现这个错误,客户端配置完全一致。(注:我无法直接访问Apache服务器,它是Web应用防火墙的一部分)
我的配置细节
使用的OpenSSL CMP命令:
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中的相关配置段:
[default] [cmp] [cmp-init] prompt = no recipient = [ca-dn] path = [path] tls_host = MyHostname tls_used = yes server = MyHostname:443 path = [default path] trusted = [trusted.pem] cacertsout = [capubs.pem]
注:server、tls_host和tls_used这些参数均在openssl.cfg中定义。
后续排查发现的规律
- 无论
server参数填写什么值,该值都会原封不动地出现在SNI扩展的Server Name中,甚至长度计算都包含了https://前缀或者:443端口后缀的长度 - 如果
server中带前缀或端口,SNI里的名称就和HTTP头里的主机名不匹配;但如果只填纯主机名,哪怕设置了tls_used=yes,请求也会发到默认的80端口,这显然不符合需求
按照SNI的Server Name Type为Host_Name的定义,这里的服务器名本就不该包含协议前缀或端口号,现在我不确定该如何调整配置,才能让SNI只传递纯主机名,同时请求又能正确发到443端口?
备注:内容来源于stack exchange,提问作者daniel buettiker

