【问题标题】:How can I verify certificate has "CA=true" basic constraint?如何验证证书是否具有“CA=true”基本约束?
【发布时间】:2017-03-29 07:59:07
【问题描述】:

我是 openssl API 的新手

当我通过这个命令使用 openssl APP 时:

openssl x509 -in mycert.crt -text -noout

我感兴趣的输出是:

    ...
    X509v3 extensions:
        X509v3 Basic Constraints: critical
            CA:TRUE <-- this section I want to validate in my code
    ...

我想使用 OpenSSL c API 验证 CA 部分,但不知道如何。 我已经深入了解了 APP src 代码,但是当我到达时迷路了

openssl/crypto/ct/ct_prn:102

BIO_printf(out, "\n%*sExtensions: ", indent + 4, "");
if (sct->ext_len == 0)
    BIO_printf(out, "none");
else
    BIO_hex_string(out, indent + 16, 16, sct->ext, sct->ext_len);

我的问题: 迭代扩展的正确方法是什么,找到基本约束部分并验证我的证书是 CA:TRUE

额外问题: 您在 openssl API 中搜索方法的方法是什么

【问题讨论】:

    标签: c ssl openssl x509


    【解决方案1】:

    额外问题:您在 openssl API 中搜索方法的方法是什么

    遗憾的是,有时没有简单的方法。我将引导您完成我用来回答此类独特问题的步骤。

    如果您知道要查找的内容,有时您可以使用像 ctags 这样的符号浏览器。但是我不使用它;相反,我通常 grep 来源。

    如果您听说过 OpenSSL “自我记录”,这就是它的缩影。


    我的问题:迭代扩展的正确方法是什么, 找到基本约束部分并验证我的证书是 CA:是的

    一段时间后,您会对有趣的东西有所了解。从下面的 grep 中,我知道它是 NID_basic_constraints

    openssl-1.1.0b$ grep -iR basic * | grep constraint
    crypto/objects/obj_dat.h:    0x55,0x1D,0x13,                                /* [  505] OBJ_basic_constraints */
    crypto/objects/obj_dat.h:    {"basicConstraints", "X509v3 Basic Constraints", NID_basic_constraints, 3, &so[505]},
    crypto/objects/obj_dat.h:      87,    /* OBJ_basic_constraints            2 5 29 19 */
    crypto/objects/obj_mac.num:basic_constraints        87
    crypto/objects/objects.txt:!Cname basic-constraints
    crypto/x509v3/v3_bcons.c:    NID_basic_constraints, 0,
    crypto/x509v3/v3_purp.c:        NID_basic_constraints,  /* 87 */
    crypto/x509v3/v3_purp.c:    /* Handle basic constraints */
    crypto/x509v3/v3_purp.c:    if ((bs = X509_get_ext_d2i(x, NID_basic_constraints, NULL, NULL)))
    ...
    

    从上面,我知道了一些事情。首先,v3_purp.c 是感兴趣的文件。其次,X509_get_ext_d2i(x, ...) 表示xX509*。第三,NID_basic_constraints 是感兴趣的项目。

    这里是函数的头部和感兴趣的部分。 BASIC_CONSTRAINTSbs-&gt;ca 看起来都很有趣。

    static void x509v3_cache_extensions(X509 *x)
    {
        BASIC_CONSTRAINTS *bs;
        PROXY_CERT_INFO_EXTENSION *pci;
        ASN1_BIT_STRING *usage;
        ASN1_BIT_STRING *ns;
        EXTENDED_KEY_USAGE *extusage;
        X509_EXTENSION *ex;
    
        int i;
        if (x->ex_flags & EXFLAG_SET)
            return;
        X509_digest(x, EVP_sha1(), x->sha1_hash, NULL);
        /* V1 should mean no extensions ... */
        if (!X509_get_version(x))
            x->ex_flags |= EXFLAG_V1;
        /* Handle basic constraints */
        if ((bs = X509_get_ext_d2i(x, NID_basic_constraints, NULL, NULL))) {
            if (bs->ca)
                x->ex_flags |= EXFLAG_CA;
            if (bs->pathlen) {
                if ((bs->pathlen->type == V_ASN1_NEG_INTEGER)
                    || !bs->ca) {
                    x->ex_flags |= EXFLAG_INVALID;
                    x->ex_pathlen = 0;
                } else
                    x->ex_pathlen = ASN1_INTEGER_get(bs->pathlen);
            } else
                x->ex_pathlen = -1;
            BASIC_CONSTRAINTS_free(bs);
            x->ex_flags |= EXFLAG_BCONS;
        }
        ...
    }
    

    接下来,结帐BASIC_CONSTRAINTS。您需要 _st,因为这就是 OpenSSL 命名其结构的方式。

    $ grep -IR BASIC_CONSTRAINTS * | grep _st
    include/openssl/x509v3.h:typedef struct BASIC_CONSTRAINTS_st {
    

    快速浏览一下BASIC_CONSTRAINTS_st

    typedef struct BASIC_CONSTRAINTS_st {
        int ca;
        ASN1_INTEGER *pathlen;
    } BASIC_CONSTRAINTS;
    

    最后一个问题可能是,您如何获得X509 *x?嗯,你可以从:

    • SSL_get_peer_certificate(来自 SSL 连接)
    • PEM_read_X509(从 PEM 编码转换)
    • d2i_X509(从 ASN.1/DER 编码转换)
    • 等等……

    如果你已经有一个X509* x,看起来你只需要测试x-&gt;ex_flags &amp; EXFLAG_V1

    起泡、冲洗、重复EXFLAG_V1X509_st

    $ grep -IR EXFLAG_V1 * | grep define
    crypto/x509v3/v3_purp.c:#define V1_ROOT (EXFLAG_V1|EXFLAG_SS)
    include/openssl/x509v3.h:# define EXFLAG_V1               0x40
    
    $ grep -IR X509 * | grep _st | grep typedef
    crypto/x509v3/pcy_int.h:typedef struct X509_POLICY_DATA_st X509_POLICY_DATA;
    include/openssl/ossl_typ.h:typedef struct x509_st X509;
    include/openssl/ossl_typ.h:typedef struct X509_algor_st X509_ALGOR;
    include/openssl/ossl_typ.h:typedef struct X509_crl_st X509_CRL;
    ...
    

    【讨论】:

    • 很好的解释和演练+1
    猜你喜欢
    • 2023-01-19
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 2021-07-22
    • 2021-12-18
    相关资源
    最近更新 更多