ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python 3 – 从X509证书中提取公钥并使用它进行加密

2019-06-24 13:57:07  阅读:832  来源: 互联网

标签:python cryptography ssl openssl encryption


由于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 https://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#libs已经过测试).它适用于命令行OpenSSL生成的证书.

我检查了第二个函数的输出,它与第一个函数的输出不同,但输出的最后266个字节是等价的:

extract_publickey_1(certstr)[-266:] == extract_publickey_2(certstr)[-266:]

返回True.

我的问题是,这里发生了什么?这个问题有方法解决吗?

解决方法:

首先,您必须明白,因为X.509证书是以ASN.1格式编码的,所以它被表示为各种值的深层和任意嵌套集合 – 并且嵌套样式和值数据类型可能是任意的在DER模式下.因此,期望固定位置和固定形式的场是非常天真的,即没有进一步的嵌套和严格的数据类型(特别是当涉及到文本字符串时);更不用说使用“魔术常数”总是一个坏主意.这就是为什么你应该尽可能使用像get_pubkey()这样的专用函数,而不是像在asn1类中那样自己解析复杂的文档.

其次,您必须了解,因为X.509规范与算法无关,所以没有“RSA模数”,“RSA公共指数”等特定字段.相反,只有一个通用的“公钥”字段,它有一组嵌套的子字段 – 指定算法OID及其数字属性.例如,RSA公钥有2个属性:模数n和加密指数e;另外,你的extract_publickey_2()函数会预先设置一个始终为零的属性,我不知道它代表什么.您的RSA实现需要数字参数而不是字节数组或复杂的ASN.1值的机会很高,这就是您可能需要使用asn1.DerSequence.decode()或更多RSA特定函数来提取它们的原因.

标签:python,cryptography,ssl,openssl,encryption
来源: https://codeday.me/bug/20190624/1278922.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有