mbedtls - 如何使用 mbedtls 从证书中提取单个 OID?

标签 mbedtls

我有一个 x509 证书加载到 mbedtls 中,我可以通过以下方式获取整个主题字段:

mbedtls_x509_dn_gets(p, n, cert.subject);

可以对输出进行字符串标记以提取特定字段,但这似乎容易出错。

是否有一种简单的方法可以获取该字段的各个 OID 值,例如 CN 或 OU 条目?

最佳答案

用法:

const mbedtls_x509_name *name = &cert_ctx.subject;
char value[64];
size_t value_len;

value_len = find_oid_value_in_name(name, "CN", value, sizeof(value));
if(value_len)
{
    printf("CN: %s\n", value);
} else
{
    printf("Unable to find OID\n");
}

功能:
size_t find_oid_value_in_name(const mbedtls_x509_name *name, const char* target_short_name, char *value, size_t value_length)
{
    const char* short_name = NULL;
    bool found = false;
    size_t retval = 0;

    while((name != NULL) && !found)
    {
        // if there is no data for this name go to the next one
        if(!name->oid.p)
        {
            name = name->next;
            continue;
        }

        int ret = mbedtls_oid_get_attr_short_name(&name->oid, &short_name);
        if((ret == 0) && (strcmp(short_name, target_short_name) == 0))
        {
            found = true;
        }

        if(found)
        {
            size_t bytes_to_write = (name->val.len >= value_length) ? value_length - 1 : name->val.len;

            for(size_t i = 0; i < bytes_to_write; i++)
            {
                char c = name->val.p[i];
                if( c < 32 || c == 127 || ( c > 128 && c < 160 ) )
                {
                    value[i] = '?';
                } else
                {
                    value[i] = c;
                }
            }

            // null terminate
            value[bytes_to_write] = 0;

            retval = name->val.len;
        }

        name = name->next;
    }

    return retval;
}

关于mbedtls - 如何使用 mbedtls 从证书中提取单个 OID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51392127/

相关文章:

c - MBEDTLS 有错误查找功能吗?

c++ - 使用 mbedTLS 从服务器提取公共(public)证书链并存储为字符串

c# - ECDiffieHellman - mbedTLS 与 C#

c - MbedTLS 和 .NET BouncyCaSTLe 与 Curve25519 的互操作性问题

ssl - 指定 Arduino WiFiClientSecure 证书

node.js - 我可以限制 Node.js/express.js 中 TLS 消息的长度吗?

ssl - wolfSSL vs. MBEDTLS vs. OpenSSL - 有什么区别?

c++ - mbedTLS pk 解析错误

c - MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED