您的位置:

报错SSLError(f'Fingerprints did not match. Expected "{fingerprint}", got "{cert_digest.hex()}"')的解决

  发布时间:2023-02-22 09:45:00
报错的原因错误是由于urllib在发起HTTPS请求时,服务器返回的证书与预期的证书指纹不匹配导致的。如何解决解决这个问题的方法有以下几种:更新本地证书预期指纹使用 urllib的关闭警告使用 verify=False 关闭证书验证使用 CA_BUNDLE 或 ca_certs 参数指定证书颁发机构的证书最好的方法是第一种,确保预期指纹与服务器返回的证书匹配,保证了安全性。

报错的原因

SSLError('Fingerprints did not match. Expected "{fingerprint}", got "{cert_digest.hex()}"') 错误是由于urllib3在发起HTTPS请求时,服务器返回的证书与预期的证书指纹不匹配导致的。这通常是由于证书更换或更新导致的。

如何解决

解决这个问题的方法有以下几种:

1. 更新本地证书预期指纹

2. 使用 urllib3 的 disable_warnings() 关闭警告

3. 使用 verify=False 关闭证书验证

4. 使用 CA_BUNDLE 或 ca_certs 参数指定证书颁发机构的证书

最好的方法是第一种,确保预期指纹与服务器返回的证书匹配,保证了安全性。

使用例子

第一种方法,更新本地证书预期指纹


import urllib3

http = urllib3.PoolManager()

#获取服务器返回的证书
r = http.request('GET', 'https://www.example.com', retries=False)

#获取证书指纹
cert_digest = r.peercert(binary_form=True)
fingerprint = cert_digest.hex()

#更新本地证书预期指纹
http.connection_from_url('https://www.example.com').cert_reqs = 'CERT_REQUIRED'
http.connection_from_url('https://www.example.com').ca_certs = fingerprint

#发起请求
r = http.request('GET', 'https://www.example.com')

第二种方法,使用 urllib3 的 disable_warnings() 关闭警告


import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
http = urllib3.PoolManager()
r = http.request('GET', 'https://www.example.com', retries=False)

第三种方法,使用 verify=False 关闭证书验证


import urllib3

http = urllib3.PoolManager()
r = http.request('GET', 'https://www.example.com', retries=False,verify=False)

第四种方法,使用 CA_BUNDLE 或 ca_certs 参数指定证书颁发机构的证书


import urllib3

http = urllib3.PoolManager(
    cert_reqs='CERT_REQUIRED',
    ca_certs='path/to/ca_bundle.crt'
)
r = http.request('GET', 'https://www.example.com', retries=False)

请注意,在实际的生产环境中,使用第三种和第四种方法可能会增加安全风险,在使用这些方法之前应该谨慎考虑。