我正在努力实现一个使用API的Web应用程序.在响应期间,API服务器通过链接发送X509证书(PEM格式,由签名证书和一个或多个中间证书组成到根CA证书),我必须下载并用于进一步验证.
在使用证书之前,我需要确保链中的所有证书组合在一起,以创建对受信任的根CA证书的信任链(以检测并避免任何恶意请求).我在python中很难做到这一点,我对这个主题的研究并没有产生任何有用的东西.
使用请求和M2Crypto可以轻松获取和加载证书
import requests
from M2Crypto import RSA, X509
mypem = requests.get('https://server.com/my_certificate.pem')
cert = X509.load_cert_string(str(mypem.text), X509.FORMAT_PEM)
Run Code Online (Sandbox Code Playgroud)
但是,验证证书链是一个问题.我不可能将证书写入磁盘以便使用openssl像subprocess这样的命令行实用程序,因此必须通过python完成.我也没有任何打开的连接,因此使用基于连接的验证解决方案(如本答案/主题中提到的那样:https://stackoverflow.com/a/1088224/4984533)也不起作用.
关于这个问题的另一个线程(在/sf/answers/309895701/),abbot解释说m2crypto无法进行此验证,并说他已经编写了一个扩展以允许验证(使用模块m2ext),但他的补丁从不似乎工作,即使我知道它是有效的,总是返回false:
from m2ext import SSL
ctx = SSL.Context()
ctx.load_verify_locations(capath='/etc/ssl/certs/') # I have run c_rehash in this directory to generate a list of cert files with signature based names
if not ctx.validate_certificate(cert): # always happens
print('Invalid certificate!')
Run Code Online (Sandbox Code Playgroud)
在这里的类似线程中也有这个答案/sf/answers/630543511/其中约翰马修斯声称有一个补丁写的会做,但不幸的是补丁链接现在已经死了 - 无论如何那里是该线程的评论,说明该补丁不适用于openssl 0.9.8e.
所有与验证python中的证书信任链相关的答案似乎都链接到死补丁或返回m2ext.
是否有一种简单,直接的方法来验证我在Python中的证书信任链?