【发布时间】:2014-06-23 03:08:52
【问题描述】:
由于 M2Crypto 库不适用于 Python 3,我正在寻找一种方法来读取 X509 证书,从中提取公钥并将其用于 RSA 加密。
我目前有以下两个功能:
from ssl import PEM_cert_to_DER_cert # standard library
from Crypto.Util import asn1 # http://pycrypto.org
from OpenSSL.crypto import * # https://pythonhosted.org/pyOpenSSL/
def extract_publickey_1(certstr):
""" from http://stackoverflow.com/questions/12911373 """
der = PEM_cert_to_DER_cert(certstr)
cert = asn1.DerSequence()
cert.decode(der)
tbs = asn1.DerSequence()
tbs.decode(cert[0])
return tbs[6]
def extract_publickey_2(certstr):
return dump_privatekey(FILETYPE_ASN1,
load_certificate(FILETYPE_PEM, certstr).get_pubkey())
第一个函数为某些证书引发IndexError,特别是那些不是从命令行 OpenSSL 生成的证书,而是一些加密库(python 和 c# 库已经过测试。)它可以工作用于命令行 OpenSSL 生成的证书。
我检查了第二个函数的输出,它与第一个不同,但输出的最后 266 个字节是等效的:
extract_publickey_1(certstr)[-266:] == extract_publickey_2(certstr)[-266:]
返回True。
我的问题是,这里发生了什么?有解决办法吗?
【问题讨论】:
-
如果您发布其中一个会产生错误的证书和一个不会产生错误的证书,那么调查您的问题可能会更容易;可能使用最小的密钥大小。
-
@AntonSamsonov This certificate 有效。 This one 没有。
标签: python ssl encryption cryptography openssl