openssl获取证书扩展

时间:2012-04-04 14:16:31

标签: c 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编码的。 有关如何获取扩展数据的任何想法吗?

编辑: 根据建议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≠%£甲

3 个答案:

答案 0 :(得分:1)

这非常有趣。我一直在观看谈话,across the link you provided在这里,我同意Roger Dahl在他的回答中的评论:

  

您似乎正在寻求有关如何提取的一般解决方案   x509v3扩展中的信息。作为这个问题的标题   状态,它只是解码单个OCTET STRING的特殊情况。除此之外,我只能指出你最初的建议   @Francois,使用外部ASN.1解析器,例如SNACC   或libtasn1并查看OpenSSL源代码(周围   加密/ ASN1 / asn1_par.c:135)

(Link补充我的。)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

如果您想要文本表示,可以使用内存BIO。我已经回答了this线程中关键用法扩展的解决方法,但每种扩展的方法都是相同的。

问候。