gpt4 book ai didi

c - 如何从 X509 证书中获取 key 使用值?

转载 作者:太空狗 更新时间:2023-10-29 15:39:58 25 4
gpt4 key购买 nike

我需要从 x509 证书中检索信息以验证 key 使用情况。例如,我需要确保证书可用于数字签名 (80)。

它可以通过以下代码片段打印出来,但我实际上想验证证书是否具有特定属性。我需要的是像 boolean certHasAbility(X509 * cert, int purpose ); 这样的方法,其中 purpose 可以是 DigitalSignature(80)Key Encipherment(20)

STACK_OF(X509_EXTENSION) *ext_list;

ext_list = cert->cert_info->extensions;
outbio = BIO_new_fp(stdout, BIO_NOCLOSE);

if(sk_X509_EXTENSION_num(ext_list) <= 0)
return 1;

for (int i=0; i<sk_X509_EXTENSION_num(ext_list); i++) {
ASN1_OBJECT *obj;
X509_EXTENSION *ext;

ext = sk_X509_EXTENSION_value(ext_list, i);

obj = X509_EXTENSION_get_object(ext);
BIO_printf(outbio, "\n");
BIO_printf(outbio, "Object %.2d: ", i);
i2a_ASN1_OBJECT(outbio, obj);
BIO_printf(outbio, "\n");
X509V3_EXT_print(outbio, ext, NULL, NULL);
BIO_printf(outbio, "\n");
}

最佳答案

我会使用 X509_get_ext_d2i 函数:

static void print_my_key_usage(X509 *cert)
{
ASN1_BIT_STRING *usage = X509_get_ext_d2i(cert, NID_key_usage, NULL, NULL);
if (usage && (usage->length > 0))
{
if (usage->data[0] & 0x80)
printf("digitalSignature\n");
....
if (usage->data[0] & 0x08)
printf("keyAgreement\n");
if (usage->data[0] & 0x04)
printf("keyCertSign\n");
if (usage->data[0] & 0x02)
printf("cRLSign\n");
}
}

您可以从 RFC5280 中找到位的详细信息.因为位串中可以有1个以上的字节,你需要在你的函数中以某种方式处理它:

boolean certHasAbility(X509 *cert, int purpose)
{
ASN1_BIT_STRING *usage = X509_get_ext_d2i(cert, NID_key_usage, NULL, NULL);
if (usage)
{
if (usage->length == 1)
{
return (usage->data[0] & purpose) == purpose;
}
else
{
// TODO: handle different lengths.
}
}
}

关于c - 如何从 X509 证书中获取 key 使用值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46527265/

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