gpt4 book ai didi

python - 使用 Python 确定 SSL 证书是否是自签名的

转载 作者:太空狗 更新时间:2023-10-29 19:27:02 25 4
gpt4 key购买 nike

我正在尝试确定 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 命令。

最佳答案

OpenSSL definition of self-signed是:

The subject and issuer names match and extension values imply it is self signed.

code that determines whether a cert is self-signed是:

/* Return 1 is a certificate is self signed */
static int cert_self_signed(X509 *x)
{
X509_check_purpose(x, -1, 0);
if (x->ex_flags & EXFLAG_SS)
return 1;
else
return 0;
}

还有 code that sets EXFLAG_SS :

/* Does subject name match issuer ? */
if (!X509_NAME_cmp(X509_get_subject_name(x), X509_get_issuer_name(x))) {
x->ex_flags |= EXFLAG_SI;
/* If SKID matches AKID also indicate self signed */
if (X509_check_akid(x, x->akid) == X509_V_OK &&
!ku_reject(x, KU_KEY_CERT_SIGN))
x->ex_flags |= EXFLAG_SS;
}

所以基本上要检查三件事:

  • 主题名称和发行者名称必须匹配
  • 主题 key 标识符和权限 key 标识符必须匹配
  • 证书必须包含设置了 KU_KEY_CERT_SIGN 位的 key 使用扩展

您已经在比较主题名称和颁发者名称。下一件重要的事情是比较 SKID 和 AKID。粗略地浏览 pyopenssl 之后,它看起来并没有提供一种方法来检查这一点,因此如果您想要一个纯 Python 解决方案,您可能必须扩展该库。然而,即使是您拥有的代码也可能会覆盖您希望覆盖的 95% 的情况。

关于python - 使用 Python 确定 SSL 证书是否是自签名的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56763385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com