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 に答える