使用pyca cryptography验证私钥与PEM格式证书的匹配关系
使用cryptography原生接口校验证书与私钥匹配性
实现逻辑
核心通过「私钥签名+证书公钥验签」的密码学原生流程完成校验,相比直接比对公钥字节串的方案,严谨性更高,完全基于cryptography提供的原生接口实现。
完整代码实现
import os from cryptography.x509 import load_pem_x509_certificate from cryptography.hazmat.primitives import serialization, hashes from cryptography.hazmat.primitives.asymmetric import padding, rsa, ec, ed25519, ed448 from cryptography.exceptions import InvalidSignature def verify_cert_key_match(cert_path: str, key_path: str, key_password: bytes = None) -> bool: # 加载证书和私钥 with open(cert_path, 'rb') as f: cert = load_pem_x509_certificate(f.read()) with open(key_path, 'rb') as f: private_key = serialization.load_pem_private_key( f.read(), password=key_password ) # 生成随机测试数据 test_data = os.urandom(32) # 适配不同密钥类型的签名和验签逻辑 try: if isinstance(private_key, rsa.RSAPrivateKey): signature = private_key.sign( test_data, padding.PSS( mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH ), hashes.SHA256() ) cert.public_key().verify( signature, test_data, padding.PSS( mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH ), hashes.SHA256() ) elif isinstance(private_key, ec.EllipticCurvePrivateKey): signature = private_key.sign( test_data, ec.ECDSA(hashes.SHA256()) ) cert.public_key().verify( signature, test_data, ec.ECDSA(hashes.SHA256()) ) elif isinstance(private_key, (ed25519.Ed25519PrivateKey, ed448.Ed448PrivateKey)): signature = private_key.sign(test_data) cert.public_key().verify(signature, test_data) else: # 不支持的密钥类型回退到公钥字节比对逻辑 cert_pub_bytes = cert.public_key().public_bytes( encoding=serialization.Encoding.PEM, format=serialization.PublicFormat.SubjectPublicKeyInfo ) key_pub_bytes = private_key.public_key().public_bytes( encoding=serialization.Encoding.PEM, format=serialization.PublicFormat.SubjectPublicKeyInfo ) return cert_pub_bytes == key_pub_bytes # 验签没有抛异常即匹配 return True except InvalidSignature: return False # 调用示例 if __name__ == "__main__": is_match = verify_cert_key_match("/path/to/crt", "/path/to/privatekey") print(is_match)
代码说明
- 兼容主流密钥类型:支持RSA、ECDSA、Ed25519、Ed448等常用非对称密钥类型的校验
- 异常兼容:遇到不支持的密钥类型时,会自动回退到公钥字节比对逻辑,保证校验能力的通用性
- 可自定义返回逻辑:如果需要匹配失败时抛出异常而非返回布尔值,仅需修改
InvalidSignature异常捕获块的逻辑即可 - 版本兼容说明:cryptography 3.4及以上版本无需显式传入
default_backend参数,若使用更低版本,可在加载证书、私钥的接口中补回backend=default_backend()参数即可
内容的提问来源于stack exchange,提问作者pstatix
相关产品推荐
相关产品推荐

