我知道可以通过使用OpenSSL或M2Crypto在Python中读取证书,这在How can I retrieve the TLS/SSL peer certificate of a remote host using python?中有很大的解释,但我希望能够使用非受信任的证书执行相同的操作.
所谓不信任,是指我(例如)刚刚生成的证书,并将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
unable to load certificate
139698977908608:error:0906D06C:PEM routines:PEM_read_bio:no start >line:pem_lib.c:703:Expecting: TRUSTED CERTIFICATE
期望:可信证书是这里的关键问题.
我能怎么做 ?
谢谢您的帮助 !
更新:通过搜索更多内容,我读到如果私钥位于此SO答复https://*.com/a/12312994/330867的证书(又称为pem)内,则此方法有效,但是我要实现的是一个可以从来自以下证书的证书中提取信息的系统除我以外的其他人.而且我非常确定“其他人”将不想共享他们的私钥,因此我仍然处于困境.有任何想法吗 ?
更新2:看来x509和req证书之间存在差异.如前所述,用命令before生成的是一个req.
所以现在我现在可以通过第一个SO链接读取x509证书,但是如何在python中读取req证书?
解决方法:
好吧,我找到了答案,我相信它会帮助别人!
因此,“ req”证书和x509证书之间存在重要区别!
在x509中,私钥也包含在文件中!
因此,在下面,我将展示如何使用REQ和x509类型的证书生成证书并在Python中读取它.
使用“要求”证书:
生成它:
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中加载证书:
>对于“要求”:load_certificate_request()
>对于“ x509”:load_certificate()
就这么简单;)