有没有办法在 Python 中禁用证书验证 (CERT_NONE) 来获取远程对等证书?
Is there a way to get remote peer certificate with certificate verification disabled (CERT_NONE) in Python?
我正在使用 Python 3. 我正在使用 ssl
库中的 SSLContext
。
我想知道如何在 CERT_NONE
模式下请求和获取远程对等证书(与 SSLSocket.getpeercert()
一样)。目前,我得到一个空的字典(根据文档是预期的)。那么,我可以在不深入研究隐私的情况下做到这一点吗?
N.B.
我不是尝试重新实现加密。实际上,我不需要任何加密,但是我需要上下文(和套接字)和远程证书(同样,出于信息目的,不是为了验证或实际加密任何东西)。
Python/OpenSSL 混合请求客户端证书和验证它:
CERT_NONE
(OpenSSL: SSL_VERIFY_NONE
) 根本不会向客户端请求证书。这意味着客户端不会发送证书。
CERT_REQUIRE
(OpenSSL: SSL_VERFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT
) 和 CERT_OPTIONAL
(OpenSSL: SSL_VERIFY_PEER
) 将请求证书,但如果无法验证证书,也会失败。
您需要的是要求证书,然后有办法自己处理验证并只接受所有客户端证书。这可以通过自定义验证回调来完成。在 OpenSSL 中,这可以通过 SSL_CTX_set_verify. But unfortunately the Python ssl library don't seem to expose the necessary interface to have your own validation callback. But it should be possible to do with pyOpenSSL which lets you set your own verification callback.
完成
我找到了一种不偏离默认 ssl
库的方法(它的优点是存在):
socket.getpeercert(binary_form=True)
以 DER 格式提供证书,足以满足我的要求。
Afaik,返回一个空的 dict 是为了避免盲目相信人们发送的明文且未经验证的内容。
我正在使用 Python 3. 我正在使用 ssl
库中的 SSLContext
。
我想知道如何在 CERT_NONE
模式下请求和获取远程对等证书(与 SSLSocket.getpeercert()
一样)。目前,我得到一个空的字典(根据文档是预期的)。那么,我可以在不深入研究隐私的情况下做到这一点吗?
N.B.
我不是尝试重新实现加密。实际上,我不需要任何加密,但是我需要上下文(和套接字)和远程证书(同样,出于信息目的,不是为了验证或实际加密任何东西)。
Python/OpenSSL 混合请求客户端证书和验证它:
CERT_NONE
(OpenSSL:SSL_VERIFY_NONE
) 根本不会向客户端请求证书。这意味着客户端不会发送证书。CERT_REQUIRE
(OpenSSL:SSL_VERFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT
) 和CERT_OPTIONAL
(OpenSSL:SSL_VERIFY_PEER
) 将请求证书,但如果无法验证证书,也会失败。
您需要的是要求证书,然后有办法自己处理验证并只接受所有客户端证书。这可以通过自定义验证回调来完成。在 OpenSSL 中,这可以通过 SSL_CTX_set_verify. But unfortunately the Python ssl library don't seem to expose the necessary interface to have your own validation callback. But it should be possible to do with pyOpenSSL which lets you set your own verification callback.
完成我找到了一种不偏离默认 ssl
库的方法(它的优点是存在):
socket.getpeercert(binary_form=True)
以 DER 格式提供证书,足以满足我的要求。
Afaik,返回一个空的 dict 是为了避免盲目相信人们发送的明文且未经验证的内容。