我知道可以使用OpenSSL或M2Crypto在Python中读取证书,正如在How can I retrieve the TLS/SSL peer certificate of a remote host using python?中有详细解释的那样,但我希望能够使用不受信任的证书来执行相同的操作。< / p>
非信任,我的意思是证书I(例如)刚刚生成并将csr输出传递到我的python函数中。
以下是我如何生成csr:
openssl req -new -newkey rsa:2048 -nodes -keyout domain.key -out domain.csr
并将domain.csr的输出用于S.O.中的代码。之前的问题。
正如所料,这不起作用。为了更快,使用Openssl执行相同操作会导致相同的错误:
openssl x509 -text -in Domain.csr -noout
无法加载证书 139698977908608:错误:0906D06C:PEM例程:PEM_read_bio:无开始&gt;行:pem_lib.c:703:期待:TRUSTED CERTIFICATE
期待:TRUSTED CERTIFICATE 是这里的关键问题。
我该怎么办?
感谢您的帮助!
更新:通过搜索更多信息,我知道如果私有密钥位于来自此SO回复https://stackoverflow.com/a/12312994/330867的证书(也称为pem)内,这将有效,但我正在尝试实现是一个系统,可以从来自其他人的证书中提取信息。而且我很确定“其他人”不想分享他们的私钥,所以我仍然卡住了。有什么想法吗?
更新2:似乎x509和req证书之间存在差异。如前所述,使用该命令生成的是req,如上所述。
所以现在我现在可以使用第一个SO链接读取x509证书,但是如何在python中读取req证书?
答案 0 :(得分:4)
好的,我找到了答案,我相信它会帮助别人!
因此,&#34; req&#34>之间存在重要差异。证书和x509证书!
在x509中,私钥也包含在文件中!
因此,在下文中,我将展示如何使用REQ和x509类型的证书生成证书并在Python中读取它。
使用&#34; req&#34;证书:
要生成它:
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()
使用&#34; x509&#34;证书:
要生成它:
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
中加载证书的方式:
load_certificate_request()
load_certificate()
就这么简单;)