使用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字符串?
答案 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);