【问题标题】:Verifying private key belongs to certificate with pyca使用 pyca 验证私钥是否属于证书
【发布时间】:2021-11-09 00:18:07
【问题描述】:

我有一个 PEM 格式的私钥和一个证书,我想验证这两个项目是否相关联。解决方案类似于thisPyOpenSSL 的回答,但使用cryptography 模块。

我有以下内容:

from cryptography.x509 import load_pem_x509_certificate
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization

crt = '/path/to/crt'
key = '/path/to/privatekey'

cert = load_pem_x509_certificate(open(crt, 'rb').read(), default_backend())
prikey = serialization.load_pem_private_key(open(key, 'rb').read(), password=None, default_backend())

crtkey 文件是从单个 .p12 创建的,因此已知关联是有效的,但我正在寻找一种编程方式来验证这种关联是否未知。结果应该引发异常或返回 True/False,表明私钥与证书无关。

编辑:所以我能够弄清楚如何将键提取为字符串,我可以通过以下操作进行比较:

cpub = cert.public_key().public_bytes(serialization.Encoding.PEM, format=serialization.PublicFormat.SubjectPublicKeyInfo)
pkpub = prikey.public_key().public_bytes(serialization.Encoding.PEM, format=serialization.PublicFormat.SubjectPublicKeyInfo)

print(cpub == pkpub) # True

但是我想知道是否有办法使用他们的接口而不是字节串比较来验证这一点;显然,它们通过共享相同的公钥来匹配,因为 RSA 私钥包含公钥;这似乎难以验证。

【问题讨论】:

    标签: python cryptography pem pkcs#12 python-cryptography


    【解决方案1】:

    证书有一个签名,可以使用签署该证书的私钥(您的 .p12 文件中的私钥)的公钥来验证该签名。

    from cryptography.hazmat.primitives.asymmetric import padding
    
    prikey.public_key().verify(
        cert.signature,
        cert.tbs_certificate_bytes,
        # Depends on the algorithm used to create the certificate
        padding.PKCS1v15(),
        cert.signature_hash_algorithm,
    )
    

    【讨论】:

    • 这会引发InvalidSignature,但私钥来自与证书相同的.p12。
    • 您确定您使用的是正确的填充方案吗?
    • 我不确定,但我如何确定使用了什么填充模式?假设当时未知。
    • 好吧,假设您使用的是 RSA,它是 PKCS1v15 或 PSS。如果签名无效,你几乎可以保证那里有一个无效的密钥或证书......
    • 我可以保证它们与从同一个 .p12 链生成的文件相同。不幸的是,使用密码库,将填充设置为 PSS 需要一些参数,或者我不确定使用什么正确的组合。因此,我决定使用私钥对一些字节数据进行签名,使用公钥进行验证。这可以解决问题,但我想知道,是否可以从凭据中推断出 PSS 填充的参数?
    猜你喜欢
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 2012-12-08
    相关资源
    最近更新 更多