Python3-从X509证书中提取公钥并使用它进行加密
由于M2Crypto库不适用于Python3,因此我正在寻找一种读取X509证书、从中提取公钥并将其用于RSA加密的方法 我目前有以下两项职能:Python3-从X509证书中提取公钥并使用它进行加密,python,ssl,encryption,cryptography,openssl,Python,Ssl,Encryption,Cryptography,Openssl,由于M2Crypto库不适用于Python3,因此我正在寻找一种读取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/
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())
第一个函数为某些证书,特别是那些不是从命令行OpenSSL生成的证书,而是一些加密库(测试了python和c#libs)生成的证书,生成一个索引器
我已经检查了第二个函数的输出,它与第一个函数不同,但输出的最后266字节是等效的:
extract_publickey_1(certstr)[-266:] == extract_publickey_2(certstr)[-266:]
返回True
我的问题是,这里发生了什么?有解决方案吗?首先,您必须了解,因为X.509证书是以ASN.1格式编码的,所以它被表示为各种值的深度和任意嵌套集合,并且即使在DER模式下,嵌套样式和值数据类型也可能是任意的。因此,期望字段位于固定位置并以固定形式出现是非常幼稚的。E无需进一步嵌套,且具有严格的数据类型(尤其是涉及文本字符串时);更不用说使用“魔法常数”总是一个坏主意。这就是为什么您应该尽可能地使用专门的函数,如get_pubkey()
,而不是像使用asn1
类那样尝试自己解析复杂文档的原因
其次,您必须了解,因为X.509规范与算法无关,所以“RSA模”、“RSA公共指数”等没有特定字段。相反,只有一个通用“公钥”字段具有嵌套的子字段集—指定算法OID及其数值属性。例如,RSA公钥有两个属性:模数n
和加密指数e
;此外,您的extract\u publickey\u 2()
函数会预先添加一个始终为零的属性,我不知道它代表什么您的RSA实现很可能需要数字参数,而不是字节数组或复杂的ASN.1值,这就是为什么您可能需要使用asn1.DerSequence.decode()提取它们的原因
或更特定于RSA的函数。如果您发布的证书中有一个会产生错误,另一个不会产生错误,则调查您的问题可能会更容易;“可能用最小的键大小。”安东萨姆索诺夫说。没有。我已经澄清了问题的最后一部分。我也是。。。有点澄清了。:-)