首页 > 编程问答 >SSL 忽略客户端证书是自签名的

SSL 忽略客户端证书是自签名的

时间:2024-08-07 15:11:36浏览次数:8  
标签:python sockets ssl networking

我正在尝试构建一个库来构建一个库来制作 Gemini(协议)服务器,到目前为止,除了一件事之外,我一切正常。

gemini 规范 中,它说客户端能够用 tls 发送他们的证书以进行识别等,但是当在 python 中我收到证书时,我收到一个关于它如何自签名的错误 ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate (_ssl.c:1000)

这就是我设置上下文的方式。

...
self.context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
self.context.load_cert_chain(certfile=certfile, keyfile=keyfile)

ssl.context.verify_mode = ssl.CERT_OPTIONAL # optional because the spec says clients don't have to
...

现在我通过使用 .load_verify_locations 加载客户端证书来缓解这个问题,但是当您实际公开运行服务器时,这显然不起作用。

我希望它甚至不会检查客户端证书是否是自签名的,但它确实如此然后你会期望能够将其关闭,但似乎我不能?我已经阅读了很多 python SSL 文档,但仍然无法弄清楚。


你几乎完成了解决方案了!问题在于你理解了 ssl.CERT_OPTIONAL 的工作原理。

虽然看起来它应该完全跳过客户端证书验证,但实际情况是,它仍然会 请求 证书(如果客户端没有提供,则不会报错)。但是,如果提供了证书,它 像你看到的那样尝试验证证书。

你想要的是完全禁用客户端证书验证。不幸的是,标准库 ssl 模块中没有直接的方法可以做到这一点。

但是,你有几个选择:

  1. 接受警告: 你可以使用 warnings 模块来捕获并忽略 SSLCertVerificationError 。这不是最优雅的解决方案,但它可以工作。

```python import warnings import ssl

# ... 你的代码 ...

with warnings.catch_warnings(): warnings.simplefilter("ignore", ssl.SSLCertVerificationError) try: # 在这里执行涉及客户端证书的 SSL 操作 except ssl.SSLCertVerificationError: pass ```

  1. 子类化 ssl.SSLContext 你可以创建 ssl.SSLContext 的子类并覆盖 get_verify_mode() 方法以始终返回 ssl.CERT_NONE

```python import ssl

class NoCertVerificationContext(ssl.SSLContext): def get_verify_mode(self): return ssl.CERT_NONE

# ... 你的代码 ...

self.context = NoCertVerificationContext(ssl.Purpose.CLIENT_AUTH) self.context.load_cert_chain(certfile=certfile, keyfile=keyfile) ```

  1. 使用第三方库: 诸如 cryptography 之类的库提供了对 SSL 的更精细控制,包括禁用证书验证的能力。

```python from cryptography import x509 from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import hashes, serialization from cryptography.hazmat.primitives.asymmetric import rsa from cryptography.x509.oid import NameOID

# ... 生成自签名证书(如果需要)...

# 加载证书和私钥 with open("certificate.pem", "rb") as f: certificate = x509.load_pem_x509_certificate(f.read(), default_backend()) with open("key.pem", "rb") as f: private_key = serialization.load_pem_private_key( f.read(), password=None, backend=default_backend() )

# 创建 SSL 上下文 context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) context.load_cert_chain(certificate=certificate, private_key=private_key)

# 禁用证书验证 context.verify_mode = ssl.CERT_NONE

# ... 你的代码 ... ```

请记住, 禁用证书验证会降低安全性 。你应该只在测试环境或你知道自己不需要客户端身份验证的情况下执行此操作。对于生产环境,强烈建议使用适当的证书颁发机构签署的证书,并强制执行客户端证书验证。

标签:python,sockets,ssl,networking
From: 78842288

相关文章

  • 将普通 python 文件导入另一个文件时出现 AttributeError
    我是新手。我正在尝试将简单的python文件导入到我的主文件中。相同的代码在我的mac上工作,但在我的电脑上不起作用。我不断收到此错误消息。“AttributeError:模块‘logo’没有属性‘hammer_logo’”第一个文件拍卖.py代码importlogoprint(logo.hammer_logo)第......
  • 使用python读取mysql数据,并记录到本地的文件中
    上次写过一次读取sqlserver数据,写入本地文件。今天分享一下mysql的。原理相似,希望对大家有小小的帮忙PS,我是3.6.13版本python,上一版本用包mysql-connector,一直不成功,查询官方文档,发现这个版本的PYTHON简直是奇葩的存在了。基本所有版本都支持,就是几个小版本排除在外了。......
  • python合并音视频-通过moviepy模块合并音视频
    ......
  • esp32安装circuitpython
    安装Thonnyhttps://thonny.org/在Thonny中安装circuitpython在配置解释器中选择circuitython然后点击右下角“安装或更新...“variant这里我选择了DOITesp32DevelopmentBoard(试过其他的一些个,不知道为什么安装完之后会无限重启,所以最后选择了这个)烧录完之后,重新连接,Th......
  • 利用Python进行金融数据分析的全面指南【文末送书】
    文章目录Python金融数据分析技术文章Python金融数据分析【文末送书】Python金融数据分析技术文章金融数据分析在现代金融行业中扮演着至关重要的角色。通过使用Python编程语言,我们可以对大量金融数据进行处理、分析和可视化,从而获得有价值的洞察。本篇文章将介绍如何......
  • python和sliver交互
    开源第三方库:https://sliverpy.readthedocs.io/en/latest/getting-started.html#connect-example代码示例:importosimportasynciofromsliverimportSliverClientConfig,SliverClientCONFIG_PATH=os.path.join('../sliver/','moloch_127.0.0.1.cfg')......
  • 不写代码,这样使用Python seaborn、matplotlib
    今天分享一个PyQt5GUI工具,动动鼠标拖拽就使用Python的Matplotlib、Seaborn进行绘图,并导出高清PDF。sviewgui安装pip install sviewguisviewgui使用使用很简单,因为,他只有一个方法啊:buildGUI();下面以tips.csv数据和boxplot为例介绍sviewgui的使用。以下三种方法均可......
  • 零基础学习人工智能—Python—Pytorch学习(一)
    前言其实学习人工智能不难,就跟学习软件开发一样,只是会的人相对少,而一些会的人写文章,做视频又不好好讲。比如,上来就跟你说要学习张量,或者告诉你张量是向量的多维度等等模式的讲解;目的都是让别人知道他会这个技术,但又不想让你学。对于学习,多年的学习经验,和无数次的回顾学习过程,都......
  • 【Python】网络编程
    计算机网络的介绍计算机的发展经历了以下几个阶段:阶段时间物理器件第一阶段1946年到20世纪50年代后期电子管第二阶段20世纪50年代后期到20世纪60年代中期晶体管第三阶段20世纪60年代中期到20世纪70年代初期中小规模集成电路第四阶段20世纪70年代初期至今大规模集成电路1.通......
  • 猫头虎分享 Python 知识点:pandas--info()函数用法
    ......