当前位置: 首页 > 知识库问答 >
问题:

用urllib3忽略证书验证

闾丘正志
2023-03-14

我正在对具有自签名证书的私有服务使用urllib3。有什么方法可以让urllib3忽略证书错误并提出请求吗?

import urllib3
c = urllib3.HTTPSConnectionPool('10.0.3.168', port=9001)
c.request('GET', '/')

在使用以下各项时:

import urllib3
c = urllib3.HTTPSConnectionPool('10.0.3.168', port=9001, cert_reqs='CERT_NONE')
c.request('GET', '/')

出现以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3/dist-packages/urllib3/request.py", line 67, in request
    **urlopen_kw)
  File "/usr/lib/python3/dist-packages/urllib3/request.py", line 80, in request_encode_url
    return self.urlopen(method, url, **urlopen_kw)
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 415, in urlopen
    body=body, headers=headers)
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 267, in _make_request
    conn.request(method, url, **httplib_request_kw)
  File "/usr/lib/python3.3/http/client.py", line 1061, in request
    self._send_request(method, url, body, headers)
  File "/usr/lib/python3.3/http/client.py", line 1099, in _send_request
    self.endheaders(body)
  File "/usr/lib/python3.3/http/client.py", line 1057, in endheaders
    self._send_output(message_body)
  File "/usr/lib/python3.3/http/client.py", line 902, in _send_output
    self.send(msg)
  File "/usr/lib/python3.3/http/client.py", line 840, in send
    self.connect()
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 103, in connect
    match_hostname(self.sock.getpeercert(), self.host)
  File "/usr/lib/python3/dist-packages/urllib3/packages/ssl_match_hostname/__init__.py", line 32, in match_hostname
    raise ValueError("empty or no certificate")
ValueError: empty or no certificate

使用cURL我能够从服务中获得预期的响应

$ curl -k https://10.0.3.168:9001/
Please read the documentation for API endpoints

共有3个答案

段干宜
2023-03-14

我找到了问题的答案。实际上,urllib3文档并没有完全解释如何抑制SSL证书验证。缺少的是对ssl的引用。当然没有。

我的代码有一个布尔值,ssl_verify,指示我是否需要SSL验证。代码现在看起来像这样:

import ssl
import urllib3

#
#
#
    if (ssl_verify):
        cert_reqs = ssl.CERT_REQUIRED
    else:
        cert_reqs = ssl.CERT_NONE
        urllib3.disable_warnings()

    http = urllib3.PoolManager(cert_reqs = cert_reqs)

    auth_url = f'https://{fmc_ip}/api/fmc_platform/v1/auth/generatetoken'
    type = {'Content-Type': 'application/json'}

    auth = urllib3.make_headers(basic_auth=f'{username}:{password}')
    headers = { **type, **auth }

    resp = http.request('POST',
                    auth_url,
                    headers=headers,
                    timeout=10.0)
桂志新
2023-03-14

在这个问题中,我看到了许多答案,但恕我直言,太多不必要的信息会导致混乱。

只需添加cert\u reqs='cert\u NONE'参数

import urllib3
http = urllib3.PoolManager(cert_reqs='CERT_NONE')
邓令雪
2023-03-14

尝试以下代码:

import urllib3
c = urllib3.HTTPSConnectionPool('10.0.3.168', port=9001, cert_reqs='CERT_NONE',
                                assert_hostname=False)
c.request('GET', '/')

请参阅将assert_hostname设置为False将禁用SSL主机名验证

 类似资料:
  • 问题内容: 我将urllib3用于具有自签名证书的私有服务。有什么办法可以让urllib3忽略证书错误并仍然发出请求? 使用以下内容时: 引发以下错误: 使用我能够从服务中获得预期的响应 问题答案: 尝试以下代码: 请参阅将assert_hostname设置为False将禁用SSL主机名验证

  • 问题内容: 我想在通过内部公司链接向服务器发出请求时忽略。 使用python库,我可以这样做: 如何使用urllib2库做同样的事情? 问题答案: 同时,urllib2似乎默认情况下会验证服务器证书。过去显示 的警告在2.7.9中消失了,我目前在具有自签名证书(和Python 2.7.9)的测试环境中遇到此问题。 我evil的解决方法(在生产中不要这样做!): 根据文档,直接调用SSLContex

  • 我使用Spring RestTemplate发出HTTPS请求,我想忽略SSL证书 下面是我创建restTem板请求的代码: 当我使用服务器主机名时,此请求有效,但当我使用服务器IP地址时,会出现以下异常:

  • 如果某个接口不需要进行验证工作,可以在@Api注解上设置属性ignoreValidate=true(默认false)。这样调用接口时,不会进行验证操作。 同样的,在@ApiService注解里也有一个对应的ignoreValidate属性,设置为true的话,Service类下面所有的接口都忽略验证。 忽略所有接口验证 设置ApiConfig.setIgnoreValidate(true),所有接

  • 我正在开发一个应用程序,使用rest API将其连接到数据库,我的服务器有一个SSL证书,当我试图发送请求时,从我的反应本地应用程序显示此错误msg是有办法禁用SSL验证反应原生Android。 如果有人知道,帮忙。

  • 主要内容:自签名证书错误,Maven依赖关系,接受自签名证书通常,开发人员将在本地机器上或项目的开发阶段使用自签名证书。 默认情况下,HttpClient(和Web浏览器)不会接受不可信的连接。 但是,可以配置以允许不可信的自签名证书。 注意:这是一个可能存在安全风险,因为您将其用于生产时,基本上会禁用所有的认证检查,这可通导致受到攻击。 在这个例子中,我们演示了如何忽略Apache HttpClient 4.5中的SSL / TLS证书错误。 自签名证书