首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >openssl获取证书扩展

openssl获取证书扩展
EN

Stack Overflow用户
提问于 2012-04-04 22:16:31
回答 3查看 7.6K关注 0票数 5

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

我使用的代码是:

代码语言:javascript
复制
  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的建议,我正在尝试这样做:

代码语言:javascript
复制
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≠%≠

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-13 23:57:16

如果你想要一个文本表示,你可以使用内存BIO。我已经回答了如何对this线程中的键使用扩展执行此操作,但对于每个扩展,执行此操作的方法是相同的。

致以问候。

票数 1
EN

Stack Overflow用户

发布于 2012-04-10 03:30:24

这是非常有趣的。我一直在观察across the link you provided和这里的对话,我同意Roger Dahl在他的回答勘误表中的评论:

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

(链接添加我的。)

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

票数 1
EN

Stack Overflow用户

发布于 2012-04-10 06:36:39

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10012981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档