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