使用OpenSSL解码ASN.1 DER OCTET STRING

Rog*_*ahl 8 openssl asn.1 x509 der

使用OpenSSL API,我从X.509v3证书中提取了一个自定义扩展,其中包括:

X509_EXTENSION* ex = X509_get_ext(x509, 4);
Run Code Online (Sandbox Code Playgroud)

X509_EXTENSION对象包含一个值(ex-> value),它是ASN.1 OCTET STRING.OCTET STRING包含DER编码的UTF-8字符串.我正在尝试解码OCTET STRING以获得普通的UTF-8字符串.

我尝试过一些东西,比如:

ASN1_STRING_to_UTF8(&buf, ex->value);
Run Code Online (Sandbox Code Playgroud)

M_ASN1_OCTET_STRING_print(bio, ex->value);
int len = BIO_read(bio, buf, buf_size);
buf[len] = '\0';
Run Code Online (Sandbox Code Playgroud)

这些都给我DER编码的字符串.如何获得普通的UTF-8字符串?

Rog*_*ahl 7

@Francois向我指出了ASN1_get_object()函数.该功能适用​​于证书扩展仅包含单个值的情况.

ASN1_get_object()获取指向包含DER编码对象的C缓冲区的指针.它返回数据本身(通过调整指针),数据长度,ASN.1标记值和ASN.1对象类.

ASN1_OCTET_STRING* octet_str = X509_EXTENSION_get_data(extension);
const unsigned char* octet_str_data = octet_str->data;
long xlen;
int tag, xclass;
int ret = ASN1_get_object(&octet_str_data, &xlen, &tag, &xclass, octet_str->length);
printf("value: %s\n", octet_str_data);
Run Code Online (Sandbox Code Playgroud)

  • @MrGomez:谢谢你的链接.野马无法将我拖回OpenSSL API :) (3认同)
  • 是的,ASN.1 简单类型是“BOOLEAN”、“INTEGER”、“BIT STRING”、“OCTET STRING”、“NULL”、“OBJECT IDENTIFIER”、“REAL”、“ENUMERATED”和“CHARACTER STRING”。 (2认同)
  • 您似乎正在寻找有关如何提取 x509v3 扩展中的信息的通用解决方案。正如这个问题的标题所述,它只是关于解码单个“八位字节字符串”的特殊情况。除此之外,我只能向您指出 @Francois 的原始建议,即使用外部 ASN.1 解析器,例如 SNACC 或 libtasn1 并查看 OpenSSL 源代码(围绕 crypto/asn1/asn1_par.c: 135)。 (2认同)