【问题标题】:ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056)ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:无法获取本地颁发者证书 (_ssl.c:1056)
【发布时间】:2020-12-13 16:49:15
【问题描述】:

当我使用 python ssl 和套接字测试 crl revoke 时

当我尝试使用python crl文件检查peer证书是否被吊销时, 我查阅了官方的python文档,但是很少。 我的基本步骤:

  1. 将 .crl 文件转换为 .pem 文件。
  2. 调用 python ssl.load_verify_location 接口。
def tls_check(domain, port):
    addr = domain
    ctx = ssl.create_default_context()
    ctx.options &= ssl.CERT_REQUIRED
    ctx.verify_flags = ssl.VERIFY_CRL_CHECK_CHAIN
    ctx.check_hostname = False
    ctx.load_verify_locations(cafile="/home/linux/CloudBrahma_release/Utils/pre_crl.pem")
    sock = ctx.wrap_socket(socket.socket(socket.AF_INET, socket.SOCK_STREAM), server_hostname=addr)
    sock.connect((addr, port))
    print("TLS Ceritificate:")
    pprint.pprint(sock.getpeercert())
    print("TLS Version:", sock.version())
    print("TLS Cipher:", sock.cipher()[0])
    exit()
tls_check("xxxxx", 8080)

我收到了这个错误

Traceback (most recent call last):
  File "test.py", line 28, in <module>
    tls_check("100.94.2.17", 8443)
  File "test.py", line 21, in tls_check
    sock.connect((addr, port))
  File "/home/linux/py3env/lib/python3.7/ssl.py", line 1150, in connect
    self._real_connect(addr, False)
  File "/home/linux/py3env/lib/python3.7/ssl.py", line 1141, in _real_connect
    self.do_handshake()
  File "/home/linux/py3env/lib/python3.7/ssl.py", line 1117, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056)

【问题讨论】:

    标签: python sockets ssl


    【解决方案1】:
    ctx.load_verify_locations(cafile="/home/linux/CloudBrahma_release/Utils/pre_crl.pem")
    

    这需要一个具有受信任 CA 的文件。如果您使用 CRL 提供文件,那么您基本上没有受信任的 CA。这意味着它将无法找到证书的根 CA,因为您没有定义受信任的根 CA,从而导致

    ... certificate verify failed: unable to get local issuer certificate (_ssl.c:1056)
    

    如果您想检查 CRL,则给定的 cafile 必须包含受信任的根 CA 和额外的 CRL。但是,当然,这种 API 很奇怪,文档也不是很有帮助。

    【讨论】:

    • 首先非常感谢我不太明白为什么cafile需要包含crt和crl文件我测试了1.cafile=(crt_path, crl_path)显然这个没用2.我把两个证书合并成一个证书,它也不起作用
    • @createbugofmaster: cafile 是文件名,而不是元组或列表等。此文件必须包含受信任的根 CA,并且可以选择包含 CRL - 只需附加 CA 证书和 CRL 中的所有 PEM。 “我将两个证书合并为一个证书,” - 我不知道你到底做了什么以及结果是什么,所以我不能在这里说你做错了什么。没有足够的细节来重现它。
    猜你喜欢
    • 1970-01-01
    • 2020-03-04
    • 2020-03-06
    • 2021-11-25
    • 1970-01-01
    • 2020-04-12
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多