【发布时间】:2019-11-07 20:14:31
【问题描述】:
我正在尝试确定 SSL 证书是否是自签名的。目前我有以下代码比较颁发者 CN 和主题 CN,如果它们相同,则将结果标记为自签名。
with open(cert_file, "r") as f:
x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, f.read())
result = {
'subject': dict(x509.get_subject().get_components()),
'issuer': dict(x509.get_issuer().get_components()),
'serialNumber': x509.get_serial_number(),
'version': x509.get_version(),
'notBefore': datetime.strptime(x509.get_notBefore(), '%Y%m%d%H%M%SZ'),
'notAfter': datetime.strptime(x509.get_notAfter(), '%Y%m%d%H%M%SZ'),
}
extensions = (x509.get_extension(i) for i in range(x509.get_extension_count()))
extension_data = {e.get_short_name(): str(e) for e in extensions}
result.update(extension_data)
if result['issuer']['CN'] == result['subject']['CN']:
result.update({'self-signed': True})
else:
result.update({'self-signed': False})
这种比较非常简单,但适用于很多情况。我不是要验证 SSL 证书或重新实现 OpenSSL。我怎样才能更好地做到这一点并且大约 95% 确定证书是否是自签名的?
我的一个要求是我想在 Python 中执行此操作,而不是调用其他进程或使用 shell 命令。
【问题讨论】:
-
您还需要确保签名有效...
-
@PatrickMevzek 我不太关心证书的有效性,还是说这是确定证书是否是自签名的一部分?
-
证书在使用自己的私钥签名时是自签名的。使用嵌入在证书中的公钥验证证书的数字签名。在大多数情况下比较主题和颁发者字符串会起作用,但如果你想保证 100%,你必须验证签名
-
您可以在上下文中验证证书。
crypto.X509StoreContext(store, cert).verify_certificate()在自签名证书上引发带有代码 18、深度 0 和消息self-signed certificate的X509StoreContextError。
标签: python python-2.7 ssl certificate x509