如何使用Python读取不可信证书提取信息?

3 投票
1 回答
2459 浏览
提问于 2025-04-17 22:28

我知道可以通过使用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 个回答

5

好的,我找到了我的答案,我相信这会对其他人有帮助!

所以,“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()

就是这么简单;)

撰写回答