Python Requests库提示SSL证书主机名不匹配但实际一致问题排查
问题原因与解决方案
核心问题
你遇到的hostname 'a.b.c.d' doesn't match 'a.b.c.d'错误,本质是证书的Subject Alternative Name(SAN)格式配置错误:把IP地址当成DNS域名类型配置了。
具体原因
当通过IP地址(a.b.c.d)访问HTTPS服务时,Python的requests库会验证证书的SAN中是否存在IP类型的条目。如果你的证书里把a.b.c.d配置成了DNS:a.b.c.d(域名类型),即使字符串完全一致,库也会判定不匹配——因为它期望的是IP:a.b.c.d类型的SAN条目。
解决步骤
重新生成符合要求的自签名证书
生成证书时,确保SAN字段明确指定IP类型。比如使用OpenSSL生成时:- 创建临时配置文件(比如
openssl.cnf),添加以下内容:[req] distinguished_name = req_distinguished_name x509_extensions = v3_ca prompt = no [req_distinguished_name] CN = a.b.c.d [v3_ca] subjectAltName = IP:a.b.c.d - 执行生成命令:
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -config openssl.cnf -nodes
- 创建临时配置文件(比如
验证证书配置是否正确
用以下命令查看证书内容,确认SAN部分是IP类型:openssl x509 -in cert.pem -text -noout输出中应该能看到类似:
X509v3 Subject Alternative Name: IP Address:a.b.c.d替换服务器和客户端的证书
将新生成的cert.pem和key.pem替换服务器端的对应文件,客户端请求时使用新的cert.pem做验证。
补充说明
- 即使Common Name(CN)设置为IP地址,现代TLS库(包括
requests依赖的urllib3)也会优先使用SAN字段做主机名验证,所以必须确保SAN配置正确。 - 如果需要同时支持IP和域名访问,可以在SAN中添加多个条目,比如:
subjectAltName = IP:a.b.c.d,DNS:your-domain.com
内容的提问来源于stack exchange,提问作者fpvbmct
相关产品推荐
相关产品推荐

