1

我知道证书和私钥中的块模数必须相同,如果它们是相关的。但是如何使用 Python 来检查呢?我正在寻找 OpenSSL 库的解决方案,但没有找到。请告诉我解决方案,如何理解与使用 Python 相关的证书和私钥。如果私钥未以 PEM 格式加密,则为 PEM 格式的证书。最好使用标准库。不通过子进程使用 OpenSSL
谢谢。

4

3 回答 3

8
def check_associate_cert_with_private_key(cert, private_key):
    """
    :type cert: str
    :type private_key: str
    :rtype: bool
    """
    try:
        private_key_obj = OpenSSL.crypto.load_privatekey(OpenSSL.crypto.FILETYPE_PEM, private_key)
    except OpenSSL.crypto.Error:
        raise Exception('private key is not correct: %s' % private_key)

    try:
        cert_obj = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, cert)
    except OpenSSL.crypto.Error:
        raise Exception('certificate is not correct: %s' % cert)

    context = OpenSSL.SSL.Context(OpenSSL.SSL.TLSv1_METHOD)
    context.use_privatekey(private_key_obj)
    context.use_certificate(cert_obj)
    try:
        context.check_privatekey()
        return True
    except OpenSSL.SSL.Error:
        return False

来源:http ://docs.ganeti.org/ganeti/2.14/html/design-x509-ca.html#verify-whether-x509-certificate-matches-private-key

于 2015-07-27T16:01:17.670 回答
4

OpenSSL 库有一个 Python 接口:pyOpenSSL 当前版本为 0.13.1。

编辑:问题的答案......

验证私钥是否与 PyOpenSSL 的证书匹配

import OpenSSL.crypto
from Crypto.Util import asn1

c=OpenSSL.crypto

# The certificate - an X509 object
cert=...

# The private key - a PKey object
priv=...

pub=cert.get_pubkey()

# Only works for RSA (I think)
if pub.type()!=c.TYPE_RSA or priv.type()!=c.TYPE_RSA:
    raise Exception('Can only handle RSA keys')

# This seems to work with public as well
pub_asn1=c.dump_privatekey(c.FILETYPE_ASN1, pub)
priv_asn1=c.dump_privatekey(c.FILETYPE_ASN1, priv)

# Decode DER
pub_der=asn1.DerSequence()
pub_der.decode(pub_asn1)
priv_der=asn1.DerSequence()
priv_der.decode(priv_asn1)

# Get the modulus
pub_modulus=pub_der[1]
priv_modulus=priv_der[1]

if pub_modulus==priv_modulus:
    print('Match')
else:
    print('Oops')

(来源:http ://www.v13.gr/blog/?p=325 )

于 2013-11-12T13:26:43.277 回答
1

如果不使用一些 SSL 库,我没有解决方案,但如果你想要一个纯 pyopenssl 解决方案,你可以试试这个:

from OpenSSL.crypto import load_certificate, load_privatekey, dump_publickey, FILETYPE_PEM

def compare_cert(cert_str, key_str):
    cert = load_certificate(FILETYPE_PEM, crt)
    key = load_privatekey(FILETYPE_PEM, key)
    cert_pub = dump_publickey(FILETYPE_PEM, cert.get_pubkey())
    key_pub= dump_publickey(FILETYPE_PEM, key)
    if cert_pub != key_pub:
        print('Error, certificate key does not match provided key')

不确定何时dump_publickey添加,但它似乎运作良好。我只知道这适用于 pyopenssl=19.1.0 的 python3

于 2021-02-26T06:16:06.687 回答