首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法在Python客户端中使用OpenSSL的ssl.SSLContext()接收对等证书

无法在Python客户端中使用OpenSSL的ssl.SSLContext()接收对等证书
EN

Stack Overflow用户
提问于 2018-04-27 13:42:33
回答 2查看 3.7K关注 0票数 1

我是Windows用户。我使用Python 3.6.5并导入此版本的OpenSSL OpenSSL 1.0.2k

我需要为python TLS客户端编写一个脚本,我可以根据支持的TLS版本、密码套件和其他配置对其进行自定义。客户端应该能够使用自签名证书建立连接。因此,我认为我应该使用:ssl.SSLContext()而不是ssl.create_default_context()来创建我的上下文。

但是,使用下面的脚本,我永远无法获得对等体的证书。请提供清晰的代码答案,否则我尝试了许多解决方案,并查看了之前的帖子,但没有希望。

代码语言:javascript
复制
context = ssl.SSLContext() # ssl.create_default_context() 
#context.verify_mode = ssl.CERT_NONE
#context.check_hostname = True
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
domain="google.com"
ssl_sock = context.wrap_socket(s, server_hostname=domain)
ssl_sock.connect((domain, 443))

print("====== peer's certificate ======")
try:
    cert = ssl_sock.getpeercert()
    print ("issued to:", dict(itertools.chain(*cert["subject"]))["commonName"])
    print ("issued by:", dict(itertools.chain(*cert["issuer"]))["commonName"])
    print("issuance date:", cert["notBefore"])
    print("expairy date: ", cert["notAfter"])
    if (cert == None):
        print("no certificate")

except Exception as e:
    print("Error:",e)
ssl_sock.close()

问题是,当我使用ssl.SSLContext()时,我没有收到对等体的证书,但是当我使用ssl.create_default_context()时,它是正确接收的。但是,我需要能够接收自签名证书(即未经验证的证书),这就是我必须使用ssl.SSLContext()的原因。

感谢你张贴的解决方案。但我需要解析证书,即使它没有经过验证(自签名)。我信任这个证书,我需要它的信息。我看了几个帖子,包括this one。我执行了以下步骤:

打开我的服务器certificate.

  • I的-----END CERTIFICATE-----

内容导航到:C:\Python36\Lib\site-packages\certifi

  • I
  1. ,它放在目录中(步骤2) .pem cacert.pem我添加了服务器的

.pem内容,该内容以:-----BEGIN CERTIFICATE-----开头,以结束

我得到了这个错误:

代码语言:javascript
复制
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:833)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-09 03:42:09

下面是一个9行代码片段,它可以从任何url获取证书数据。

代码语言:javascript
复制
import ssl
import socket

def getcertmeta(url="",port=443):
    hostname = socket.gethostbyaddr(url)[0]
    context = ssl.create_default_context()
    with socket.create_connection((hostname, port)) as sock:
        with context.wrap_socket(sock, server_hostname=hostname) as ssock:
            return ssock.context.get_ca_certs()

锡纸备注:这个证书的东西有点可疑。它们是各种问题的根源,但科技公司却对它们痴迷不已。它们没有提供安全益处,每个证书颁发机构都被黑客入侵了(除了LetsEncrypt iirc)这是无可辩驳的,可以在idk 5分钟内在线查找和找到,还有一些其他的事情正在发生,但它们是如此的复杂和不必要的复杂,以至于很难弄清楚是什么。国际海事组织他们与英特尔ME一起被用来后门服务器数据到中央位置(就像wileaks v7披露的黑客攻击),我手机上的证书包括3-4个政府,只是直截了当地说日本政府或中国政府,它有一群像“星光科技”这样的英特尔代理公司,它都非常可疑。

EDIT2:上面的代码片段是错误的,它只获取证书颁发机构证书,而不是实际的url,这里有一个13行的代码片段来获取实际url的证书。

代码语言:javascript
复制
import socket,ssl
from contextlib import contextmanager
@contextmanager
def fetch_certificate(url="", port=443, timeout=0.5):
    cxt = ssl.create_default_context()
    sslctxsock = cxt.wrap_socket(socket.socket(), server_hostname=hostname)
    sslctxsock.settimeout(timeout)
    sslctxsock.connect((url,port))
    cert = sslctxsock.getpeercert()
    try:
        yield cert
    finally:
        sslctxsock.close()

像这样使用它:

代码语言:javascript
复制
with fetch_certificate(url=url) as cert:
   print(cert)
票数 0
EN

Stack Overflow用户

发布于 2021-06-21 10:26:52

在设置了SSLContext的默认设置ssl.CERT_NONE时,Python似乎不会解析/存储客户端的证书

代码语言:javascript
复制
import socket
import ssl

dest = ("www.google.com", 443)

sock = socket.socket(socket.AF_INET)
ctx = ssl.SSLContext()

# You will either need to add the self-signed certs to the OS cert store (varies by OS)
# See https://docs.python.org/3/library/ssl.html#ssl.SSLContext.load_verify_locations for loading non-defaults
ctx.set_default_verify_paths()

ctx.verify_mode = ssl.CERT_REQUIRED
ssock = ctx.wrap_socket(sock, server_hostname=dest[0])
result = ssock.connect(dest)
print(ssock.getpeercert())

请参见https://github.com/python/cpython/blob/main/Modules/_ssl.c#L1823,它正在执行逐位验证,因此当&模式为CERT_NONE (0)时,将跳过代码块。CERT_OPTIONAL=1或CERT_REQUIRED=2是证书解析/填充工作所必需的(否则它只会设置一个空字典)

对于您的自签名证书,您应该将它们导入到OS证书颁发机构存储中,或者使用SSLContext.load_verify_locations方法加载自签名证书(因为它是自签名的,所以您可以加载服务器/叶证书作为CA证书)

如果你使用OS-store路径,你可能只需要使用默认的上下文。我认为在Windows上有一个每个用户的CA存储(虽然不是很好)。我认为Linux上不存在这样的东西,所以你需要在系统范围内添加它。对macOS或其他操作系统不太了解

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50055935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档