【问题标题】:python 3.73 (Windows, urllib3) ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED]python 3.73 (Windows, urllib3) ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED]
【发布时间】:2019-09-30 03:26:39
【问题描述】:

执行简单代码后:

from urllib3 import ProxyManager

def GET(url):
    http = ProxyManager("https://91.208.39.70:8080")
    response = http.urlopen('GET', url)
    print(response.data)
    return ''


if __name__ == '__main__':
    result = GET("https://example.com")
    print(result)

我有下一个错误:

Traceback(最近一次调用最后一次): 文件“F:\Run\Lprogr\Phyton\lib\site-packages\urllib3\connectionpool.py”,第 597 行,在 urlopen self._prepare_proxy(conn) _prepare_proxy 中的文件“F:\Run\Lprogr\Phyton\lib\site-packages\urllib3\connectionpool.py”,第 807 行 连接.connect() 文件“F:\Run\Lprogr\Phyton\lib\site-packages\urllib3\connection.py”,第 350 行,在连接中 ssl_context=上下文) 文件“F:\Run\Lprogr\Phyton\lib\site-packages\urllib3\util\ssl_.py”,第 355 行,在 ssl_wrap_socket return context.wrap_socket(sock, server_hostname=server_hostname) wrap_socket 中的文件“F:\Run\Lprogr\Phyton\lib\ssl.py”,第 412 行 会话=会话 _create 中的文件“F:\Run\Lprogr\Phyton\lib\ssl.py”,第 853 行 self.do_handshake() 文件“F:\Run\Lprogr\Phyton\lib\ssl.py”,第 1117 行,在 do_handshake 中 self._sslobj.do_handshake() ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:证书链中的自签名证书 (_ssl.c:1056)

在处理上述异常的过程中,又发生了一个异常:

Traceback(最近一次调用最后一次): 文件“F:/My/Documents/PycharmProjects/proxyTester/proxy.py”,第 17 行,在 结果 = GET("https://example.com") 文件“F:/My/Documents/PycharmProjects/proxyTester/proxy.py”,第 11 行,在 GET 响应 = http.urlopen('GET', url) 文件“F:\Run\Lprogr\Phyton\lib\site-packages\urllib3\poolmanager.py”,第 451 行,在 urlopen return super(ProxyManager, self).urlopen(method, url, redirect=redirect, **kw) 文件“F:\Run\Lprogr\Phyton\lib\site-packages\urllib3\poolmanager.py”,第 326 行,在 urlopen 响应 = conn.urlopen(方法,u.request_uri,**kw) 文件“F:\Run\Lprogr\Phyton\lib\site-packages\urllib3\connectionpool.py”,第 670 行,在 urlopen **response_kw) 文件“F:\Run\Lprogr\Phyton\lib\site-packages\urllib3\connectionpool.py”,第 670 行,在 urlopen **response_kw) 文件“F:\Run\Lprogr\Phyton\lib\site-packages\urllib3\connectionpool.py”,第 670 行,在 urlopen **response_kw) 文件“F:\Run\Lprogr\Phyton\lib\site-packages\urllib3\connectionpool.py”,第 641 行,在 urlopen _stacktrace=sys.exc_info()[2]) 文件“F:\Run\Lprogr\Phyton\lib\site-packages\urllib3\util\retry.py”,第 399 行,增量 raise MaxRetryError(_pool, url, error or ResponseError(cause)) urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='example.com', port=443): 最大重试次数超出 url: / (由 SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败: 自签名证书在证书链中 (_ssl.c:1056)')))

更新:我不想忽略证书验证。

【问题讨论】:

标签: python python-3.x ssl


【解决方案1】:

证书是为域名注册的,而不是为 IP 注册的。要么对域名提出请求,要么忽略ssl验证(参见here),或者将https替换为http(将仅在服务器允许 http 连接时工作)

【讨论】:

    【解决方案2】:

    终于找到了解决办法。

    A.忽略 SSL 验证:

    http = ProxyManager("https://91.208.39.70:8080", cert_reqs=ssl.CERT_NONE)
    

    B.不忽略 SSL 验证:

    我从certifi 下载了CA Bundle,放置到任何文件夹,例如:f:\cert。并像这样编码:

    http = ProxyManager("https://91.208.39.70:8080", cert_reqs='CERT_REQUIRED', ca_certs='f:/cert/certs.pem')
    

    Additional info.

    如果有人知道其他可行的解决方案,请建议...

    【讨论】:

    • 仅供参考:根据证书docs,您可以使用certifi.where()获取证书文件的路径。
    【解决方案3】:

    如果您使用的是 windows server 2018/2019(我在个人数据中心服务器上尝试过。)您可以发出以下命令以允许您的程序连接。这是我能说的系统范围的修复。我必须从管理终端运行它才能让它工作,但这个命令解决了我的所有问题。

    certutil -generateSSTFromWU roots.sst && certutil -addstore -f root roots.sst && del roots.sst
    

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2021-02-22
      • 2021-10-08
      • 1970-01-01
      • 1970-01-01
      • 2015-05-05
      • 2022-01-11
      • 2022-01-18
      • 2020-12-07
      • 2015-04-01
      相关资源
      最近更新 更多