我正在使用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(扩展);
但是我不确定如何处理检索到的data对象。数据对象应该是der编码的。有关于如何获取扩展数据的想法吗?
编辑:按照here的建议,我正在尝试这样做:
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≠%≠
发布于 2012-04-13 23:57:16
如果你想要一个文本表示,你可以使用内存BIO。我已经回答了如何对this线程中的键使用扩展执行此操作,但对于每个扩展,执行此操作的方法是相同的。
致以问候。
发布于 2012-04-10 03:30:24
这是非常有趣的。我一直在观察across the link you provided和这里的对话,我同意Roger Dahl在他的回答勘误表中的评论:
似乎您正在寻找一个关于如何在x509v3扩展中提取信息的通用解决方案。正如这个问题的标题所述,它只是关于解码单个
OCTET STRING的特殊情况。除此之外,我只能向您推荐@Francois的原始建议,即使用外部ASN.1解析器,如SNACC或libtasn1,并查看OpenSSL源代码(约为crypto/asn1/asn1par.c:135)。
(链接添加我的。)
诀窍是,您正在尝试使用一个通用处理不好的模态扩展模型。This answer很好地概述了它是如何工作的。至于答案的其余部分,我同意他的观点,即在文档失败的地方,阅读the source是最好的解决方案。
发布于 2012-04-10 06:36:39
如果我处在你的位置上,我会认真考虑使用一个专用的ASN.1库来解码证书。让OpenSSL做它擅长的事情,即根据信任链验证您的证书。一旦你知道你有一个好的证书,把它传递给一个ASN.1库,让它来处理剩下的事情。(SNACC看起来不错。)请注意,整个证书本身都是用ASN.1编码的,因此您用来处理v3扩展的同一个库也可以用来处理整个证书。
https://stackoverflow.com/questions/10012981
复制相似问题