您的位置:

为什么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)

请注意,禁用证书验证或禁用主机名验证可能会增加安全风险。建议在生产环境中使用有效的证书。