为什么CertificateError(f"hostname {hostname!r} doesn't match {dnsnames[0]!r}"),怎么解决
发布时间:2023-01-24 18:30:02
报错的原因urllib的错误通常是由于主机名与证书中给定的DNS名不匹配导致的。这可能是因为证书是针对其他网站颁发的,或者证书中给定的DNS名是不正确的。你可以考虑使用其他库,例如 requests,它具有更简单的证书验证。使用例子是的,下面是一些使用urllib库的示例代码:禁用证书验证禁用主机名验证使用其他库,例如请注意,禁用证书验证或禁用主机名验证可能会增加安全风险。建议在生产环境中使用有效的证书。
报错的原因
urllib3的CertificateError("hostname {hostname!r} doesn't match {dnsnames[0]!r}")错误通常是由于主机名与证书中给定的DNS名不匹配导致的。这可能是因为证书是针对其他网站颁发的,或者证书中给定的DNS名是不正确的。
如何解决
解决这个错误的方法有几种:
1. 确保您使用的是正确的证书。如果您正在使用自签名证书,请确保它已经被添加到信任根证书颁发机构(CA)。
2. 忽略证书验证,如果你知道本地证书不可信也可以用这个方法忽略验证
3. 禁用主机名验证,如果你知道证书是正确的但是主机名不匹配,也可以用这个方法跳过验证。
4. 你可以考虑使用其他库,例如 requests,它具有更简单的证书验证。
使用例子
是的,下面是一些使用urllib3库的示例代码:
1. 禁用证书验证:
import urllib3
http = urllib3.PoolManager(cert_reqs='CERT_NONE')
response = http.request('GET', 'https://example.com')
2. 禁用主机名验证:
import urllib3
http = urllib3.PoolManager(cert_reqs='CERT_REQUIRED', assert_hostname=False)
response = http.request('GET', 'https://example.com')
3. 使用其他库,例如 requests:
import requests
response = requests.get('https://example.com', verify=False)
请注意,禁用证书验证或禁用主机名验证可能会增加安全风险。建议在生产环境中使用有效的证书。