繁体   English   中英

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

[英]Determine if SSL certificate is self signed using Python

我正在尝试确定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 定义是:

主题和发行者名称匹配和扩展值意味着它是自签名的。

确定证书是否为自签名的代码是:

/* 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;
}

以及设置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;
}

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

  • 主题名称和颁发者名称必须匹配
  • 主题密钥标识符和授权密钥标识符必须匹配
  • 证书必须包含密钥用法扩展,并设置KU_KEY_CERT_SIGN

您已在比较主题名称和颁发者名称。 下一个重要的事情是比较SKID和AKID。 粗略地看一下pyopenssl后,它看起来并不像是提供了一种方法来检查它,所以如果你想要一个纯Python解决方案,你可能需要扩展库。 但是,即使您拥有的代码可能会覆盖您95%的情况,您表示您希望它覆盖。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM