5

我正在使用 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对象。数据对象应该是去编码的。关于如何获取扩展数据的任何想法?

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

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

4

3 回答 3

1

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

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

(链接补充我的。)

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

于 2012-04-09T19:30:24.363 回答
1

如果我处于你的位置,我会认真考虑使用专用 ASN.1 库之一来解码证书。让 OpenSSL 做它擅长的事情,即根据信任链验证您的证书。一旦你知道你有一个好的证书,把它传递给一个 ASN.1 库,让它处理剩下的事情。(SNACC 看起来不错。)请注意,整个证书本身是使用 ASN.1 编码的,因此用于处理 v3 扩展的同一个库可以用于处理整个证书。

于 2012-04-09T22:36:38.760 回答
1

如果你想有一个文本表示,你可以使用内存 BIO。我已经在这个线程中回答了如何为 Key Usage 扩展解决这个问题,但是每个扩展的方法都是一样的。

问候。

于 2012-04-13T15:57:16.337 回答