openssl获取证书扩展

我正在使用openssl来解析X509证书。 我设法获得扩展,但我不知道如何提取扩展值。

我使用的代码是:

X509_EXTENSION *extension = sk_X509_EXTENSION_pop(exts); int critical = X509_EXTENSION_get_critical(extension); ASN1_OBJECT *obj = extension-> object; ln = OBJ_nid2ln(OBJ_obj2nid(obj)); if( !ln ) ln = ""; OBJ_obj2txt(objbuf,sizeof(objbuf),obj,1); int nid = OBJ_txt2nid(ln); 

这段代码告诉我扩展是否重要,并给出了扩展的nid。

我想通过以下方式可以获得价值:

ASN1_OCTET_STRING * data = X509_EXTENSION_get_data(extension);

但我不知道如何处理检索到的data对象。 数据对象应该是der编码的。 有关如何获取扩展数据的任何想法?

编辑:正如这里建议的那样,我试图这样做:

 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); 

但我解码后得到的字符串与之前相同 – 例如:4Á˃◊∫NsΣäP∂W≠%£A

如果您想要文本表示,可以使用内存BIO。 我已经回答了如何在这个线程中使用Key Usage扩展,但是对于每个扩展,这样做的方法是相同的。

问候。

这很有趣。 我一直在观察您提供的链接和此处的对话,我同意Roger Dahl在他的回答中的评论:

您似乎正在寻找有关如何在x509v3扩展中提取信息的一般解决方案。 正如这个问题的标题所述,它只是解码单个OCTET STRING的特殊情况。 除此之外,我只能指出@Francois的原始建议,即使用外部ASN.1解析器,如SNACC或libtasn1,并查看OpenSSL源代码(围绕crypto / asn1 / asn1_par.c: 135)。

(链接添加我的。)

诀窍是你正在尝试使用一般不能很好地处理的模态扩展模型。 这个答案很好地概述了它的工作原理。 至于答案的其余部分,我同意他的观察,即文档失败的地方,阅读源代码实际上是最好的解决方案。

如果我在你的位置,我会认真考虑使用一个专用的ASN.1库来解码证书。 让OpenSSL做它擅长的事情,即根据信任链validation您的证书。 一旦您知道自己拥有良好的证书,请将其传递给ASN.1库并让其处理剩余的证书。 (SNACC看起来很好。)请注意,整个证书本身都是用ASN.1编码的,因此用于处理v3扩展的相同库可用于处理整个证书。