报错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)
请注意,在实际的生产环境中,使用第三种和第四种方法可能会增加安全风险,在使用这些方法之前应该谨慎考虑。