You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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条目。

解决步骤

  1. 重新生成符合要求的自签名证书
    生成证书时,确保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
      
  2. 验证证书配置是否正确
    用以下命令查看证书内容,确认SAN部分是IP类型:

    openssl x509 -in cert.pem -text -noout
    

    输出中应该能看到类似:

    X509v3 Subject Alternative Name: 
        IP Address:a.b.c.d
    
  3. 替换服务器和客户端的证书
    将新生成的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 00:14:55