如何使用Python读取不可信证书提取信息?
我知道可以通过使用OpenSSL或M2Crypto在Python中读取证书,具体的说明可以参考这个链接:如何使用Python获取远程主机的TLS/SSL证书信息?,但我想用一个不被信任的证书来做同样的事情。
这里说的“不被信任”是指我(比如说)刚生成的证书,并把生成的csr输出粘贴到我的Python函数里。
这是我生成csr的方式:
openssl req -new -newkey rsa:2048 -nodes -keyout domain.key -out domain.csr
然后我把domain.csr的输出放入之前提到的代码中。
结果如预期,这样做是行不通的。为了更快,我用OpenSSL做同样的事情,结果也出现了同样的错误:
openssl x509 -text -in Domain.csr -noout
无法加载证书 139698977908608:error:0906D06C:PEM例程:PEM_read_bio:没有开始 >行:pem_lib.c:703:期望: 受信任的证书
期望: 受信任的证书是这里的关键问题。
我该怎么做呢?
谢谢你的帮助!
更新:经过更多的搜索,我了解到如果私钥在证书(也就是pem)里面,这样做是可行的,具体可以参考这个回答 https://stackoverflow.com/a/12312994/330867,但我想实现的是一个可以从其他人提供的证书中提取信息的系统。而我很确定“其他人”不会想分享他们的私钥,所以我仍然卡在这里。有什么想法吗?
更新2:看来x509证书和req证书之间是有区别的。之前生成的就是一个req证书,如此所述。
所以现在我知道可以通过第一个SO链接读取x509证书,但我该如何在Python中读取req证书呢?
1 个回答
好的,我找到了我的答案,我相信这会对其他人有帮助!
所以,“req”证书和x509证书之间有一个重要的区别!
在x509证书中,私钥也是包含在文件里的!
接下来,我会展示如何生成证书并在Python中读取它,使用“req”和x509类型的证书。
使用“req”证书:
生成它的方法:
openssl req -new -newkey rsa:2048 -nodes -keyout domain.key -out domain.csr
读取它的方法:
import OpenSSL
# cert contains the content of domain.csr
OpenSSL.crypto.load_certificate_request(OpenSSL.crypto.FILETYPE_PEM, cert).get_subject().get_components()
使用“x509”证书:
生成它的方法:
openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.pem
读取它的方法:
import OpenSSL
# cert contains the content of cert.pem
OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, cert).get_subject().get_components()
就这样!
区别在于你在OpenSSL.crypto
中加载证书的方式:
- 对于“req”证书:
load_certificate_request()
- 对于“x509”证书:
load_certificate()
就是这么简单;)