使用OpenSSL解码ASN.1 DER OCTET STRING

时间:2011-09-07 05:50:06

标签: openssl x509 asn.1 der

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

X509_EXTENSION* ex = X509_get_ext(x509, 4);

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

我尝试过一些事情,例如:

ASN1_STRING_to_UTF8(&buf, ex->value);

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

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

1 个答案:

答案 0 :(得分: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);