我需要编写一个脚本,通过HTTPS连接到公司内部网上的一堆站点,并验证他们的SSL证书是否有效; 他们没有过期,他们是为正确的地址等发出的.我们为这些网站使用我们自己的内部公司证书颁发机构,因此我们有CA的公钥来验证证书.
默认情况下,Python在使用HTTPS时接受并使用SSL证书,因此即使证书无效,诸如urllib2和Twisted之类的Python库也会很乐意使用证书.
是否有一个好的库可以让我通过HTTPS连接到一个站点并以这种方式验证它的证书?
如何在Python中验证证书?
我正在努力实现一个使用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中的证书信任链?
我正在试图找出如何使用m2crypto,当链可能任意长时,从X509证书的公钥版本验证信任链回到一组已知的根CA. SSL.Context模块看起来很有希望,除了我在SSL连接的上下文中没有这样做,我看不到如何使用传递给load_verify_locations的信息.
基本上,我正在寻找相当于的接口:openssl verify pub_key_x509_cert
在m2crypto中有类似的东西吗?
谢谢.
我刚开始使用X.509证书.谁能告诉我如何在linux上验证证书?用例是我的应用程序在之前的会话中下载了证书,我必须在开始新会话之前检查它是否仍然有效(即,在存储之后没有过期或撤销).我理解这里不可能有完整的样本,但任何指针都会有用.
编辑:进一步调查显示另一个称为网络安全服务(NSS)的实用程序.在可用性方面,这与OpenSSL相比如何?此外,我正在寻找程序化解决方案,因为我将无法启动命令行实用程序.
python ×3
m2crypto ×2
x509 ×2
c ×1
cryptography ×1
https ×1
linux ×1
nss ×1
openssl ×1
ssl ×1
validation ×1
verification ×1