真的想说这个世界就是草台班子!
就只是换了一个ssl证书(快到期了)导致windows server上的Python应用无法获取图片,安卓手机客户端也加载不了图片!
起因是去年在腾讯上买的通配符SSL证书本月就到期了,于是用之前囤的同款SSL证书又提交了一次。
新的证书下来后马上就安排上了。
由于是通配符证书,用在了很多地方,比如阿里的OSS,公司的部分应用网站。
实际没怎么仔细测试,只是打开网站看了下证书到期时间是对的就没怎么管了。
结果到下午有人反馈说AI应用那边下载图片失败,有报错
- An error occurred while downloading the image: HTTPSConnectionPool(host='***.cc', port=443): Max retries exceeded with url: /wimg/02a3531b8b.jpg (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1129)')))
复制代码 这明显是SSL证书的问题
它的环境是windows server 2019安装的python应用
还有发现安卓APP应用里面的图片也加载不了,但是mp3能正常加载!
找腾讯那边查了几个小时,最后还是他们找证书厂家给处理好的。换了一个公钥给我就行了。
上面的图片旧证书是指我去年申请的通配符证书,新证书是指今年刚申请的通配符证书。
下面是Grok的分析,旧证书是指我今年申请的证书,新证书是指腾讯后来提供给我的证书。
关键区别通过对比,新旧证书链的主要区别在于中间证书层: - 服务器证书:
- 新旧证书链的服务器证书完全相同(证书内容、有效期、SAN 等一致)。这表明服务器端的公钥、私钥对和域名配置没有变化,问题不在于服务器证书本身。
- 第一个中间证书:
- 新旧证书链的第一个中间证书(Sectigo Public Server Authentication CA DV E36)也完全相同,包括颁发者、有效期和密钥类型。这表明问题不在于直接签发服务器证书的中间CA。
- 第二个中间证书:
- 旧证书链:使用 USERTrust ECC Certification Authority(2019-03-12 至 2028-12-31)。
- 新证书链:使用 Sectigo Public Server Authentication Root E46(2021-03-22 至 2028-12-31)。
- 区别:
- 颁发对象:旧证书链使用 USERTrust 的 ECC CA,而新证书链使用 Sectigo 的 E46 根证书。
- 颁发时间:新证书链的中间证书更晚(2021 vs 2019),但两者有效期都覆盖当前时间。
- 信任度:USERTrust ECC Certification Authority 和 Sectigo Public Server Authentication Root E46 都是 Sectigo(前 Comodo)体系下的可信 CA,但 USERTrust ECC CA 在某些客户端(尤其是 Windows Server 2019 或安卓设备)可能未被默认信任,或者需要额外的信任配置。
- 根证书:
- 新旧证书链的根证书(AAA Certificate Services)完全相同,均为自签名的 RSA 证书,使用 SHA1 签名算法。这表明问题不在于根证书。
问题原因分析Python 应用和安卓 APP 报错 SSLCertVerificationError: unable to get local issuer certificate,表明客户端无法构建完整的信任链。可能的具体原因包括: - USERTrust ECC Certification Authority 未被信任:
- 在旧证书链中,第二个中间证书是 USERTrust ECC Certification Authority。Windows Server 2019 或安卓设备的信任存储可能未包含此证书,或者 Python 的 SSL 库(通常基于 OpenSSL)未能正确加载系统信任存储中的 USERTrust 证书。
- 新证书链使用 Sectigo Public Server Authentication Root E46,可能更广泛地被默认信任,或者在你的环境中更容易被客户端识别。
- 证书链配置问题:
- 旧证书链可能未被正确配置在服务器端。例如,服务器可能只发送了服务器证书而未包含完整的中间证书链,导致客户端无法验证信任链。
- 新证书链可能由腾讯正确配置,确保所有中间证书都随服务器证书一起发送。
- 客户端环境限制:
- Windows Server 2019 和某些安卓设备可能对 ECDSA 证书链的处理有特定要求。USERTrust ECC CA 使用 ECDSA 算法,而某些旧版系统或 Python 的 SSL 库可能对 ECDSA 证书的验证支持不完整。
- 新证书链的 Sectigo Public Server Authentication Root E46 虽然也是 ECDSA,但可能由于更新的颁发时间或更广泛的兼容性,解决了验证问题。
- 根证书的 SHA1 签名:
- 虽然新旧证书链的根证书都使用 SHA1(较老的算法),但这通常不影响现代客户端,因为 AAA Certificate Services 是广泛信任的根 CA。不过,某些严格的客户端可能对 SHA1 签名发出警告,但这不是主要问题,因为新证书链也使用相同的根证书。
为什么新证书链解决问题?新证书链替换了 USERTrust ECC Certification Authority 为 Sectigo Public Server Authentication Root E46,可能因为: - 更广泛的信任:Sectigo Public Server Authentication Root E46 在 Windows Server 2019 和安卓设备的信任存储中更可能被默认包含,或者 Python 的 SSL 库对其支持更好。
- 服务器配置优化:腾讯提供的新证书链可能在服务器端配置时确保了完整的中间证书链发送,消除了客户端无法获取中间证书的问题。
- 兼容性:新证书链的中间证书可能更符合某些客户端的验证要求,尤其是对 ECDSA 证书的处理。
中间证书:- 颁发对象: Sectigo Public Server Authentication Root E46
- 颁发者: AAA Certificate Services
- 有效期: 2021-03-22 至 2028-12-31
- 密钥类型: ECDSA
- 签名算法: SHA384withECDSA
这个我贴出来,有需要的可以直接替换这第3段证书。
- -----BEGIN CERTIFICATE-----
- MIIDyzCCArOgAwIBAgIRALmRRqcZtT13bxUtRZuVmXwwDQYJKoZIhvcNAQEMBQAw
- ezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
- A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
- BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0yMTAzMjIwMDAwMDBaFw0y
- ODEyMzEyMzU5NTlaMF8xCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExp
- bWl0ZWQxNjA0BgNVBAMTLVNlY3RpZ28gUHVibGljIFNlcnZlciBBdXRoZW50aWNh
- dGlvbiBSb290IEU0NjB2MBAGByqGSM49AgEGBSuBBAAiA2IABHb6maluIO3513fj
- Bzuo2z1fOOirVaZWT9ZI6ux/LarDssV57JlhfxB5xwJa+QQ39TQ1K3fOfyCPUqMA
- iezVp6JtW+NLkpOggPUBlNzwaAceze7+JVK1IEMcG/7rGc5Do6OCARIwggEOMB8G
- A1UdIwQYMBaAFKARCiM+lvEH7OKvKe+CpX/QMKS0MB0GA1UdDgQWBBTRItpMWfFL
- XyY4qp3W7usNw/upYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAd
- BgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEQYDVR0gBAowCDAGBgRVHSAA
- MEMGA1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0FBQUNl
- cnRpZmljYXRlU2VydmljZXMuY3JsMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcw
- AYYYaHR0cDovL29jc3AuY29tb2RvY2EuY29tMA0GCSqGSIb3DQEBDAUAA4IBAQBy
- 4yYwSxjWWj3OGzwOXa7sjOhKYeATppWTTgULid5/MN/j5pGp5BU9uKnclwlYOMC6
- B3JzHvcyLuHy2kCrLRL8jFG9fYKWo+3hqqv9iqLpBhiLfVfg2Bbj6Sp/OCTbn5Ds
- msI1iwQclW06ujlXQAxm/zdLKgLL9Bm57Xb4Vc0wNt/P+xhD6nSkOX2edtF7DK43
- 2lcJaer3z+VCBHjZ6LB7i1/lRrT9rWrqOHuZABRBTR5BNNHqKcIXRcUntb427+tY
- rVs1sBpVX/RH1mogIWEckMz550WAdbcfYh8erxVRf0sXMLXajsrTkwdhxEMZMn/R
- 9lfAGBUCAAIUleto+2rv
- -----END CERTIFICATE-----
复制代码
|