2011-09-07 33 views
8
一个ASN.1 DER OCTET STRING

使用OpenSSL的API,我已经提取从X.509v3证书自定义扩展用:解码与OpenSSL的

X509_EXTENSION* ex = X509_get_ext(x509, 4); 

的X509_EXTENSION对象包含一个值(EX- >值),这是一个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

我用 'asn1_get_object' 来做到这一点在不久前,以下OpenSSL中代码的例子(约加密/ ASN1/asn1_par.c:135)。以这种方式解码大型结构是非常痛苦的,我推荐使用替代的asn1解析器,如SNACC或libtasn1。 – Francois

+0

@Francois:谢谢你的提示。由于我不是想解码一个大的结构,只需要一个字符串,ASN1_get_object()就足够了。但是,我尝试使用它,基于它在asn1_par.c中的使用方式,但无法使其工作。你能提供一个例子吗? –

+0

@Francois:我发现如何使用该功能并发布了基于此的答案。再次感谢。 –

回答

5

@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); 
+0

我正在尝试做同样的事情,但是在应用您的解决方案时,我获得了与调用ASN1_get_object函数之前相同的字符串。你确定这个函数解码吗? – Maggie

+0

@Maggie:对于我正在处理的ASN.1类型,“OCTET STRING”,它可以工作。但它可能会起作用,因为DER编码对“OCTET STRING”的唯一作用是将其封装在一个标题中。字节本身保持不变。 ASN1_get_object()确实删除了头部,但也许这就是*所有*它呢? –

+0

正如我所说,我正在做同样的事情,即。试图使用openssl获得der编码证书扩展的可读值。您提供的解决方案不起作用。 – Maggie