【问题标题】:openssl get certificate extensionsopenssl 获取证书扩展
【发布时间】:2012-04-18 06:30:11
【问题描述】:

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

编辑: 正如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≠%£A

【问题讨论】:

  • 我认为一些示例证书和编译良好的代码,只是没有正确显示扩展值,会非常有用。
  • 我在做一个iOS项目,openssl是为iOS编译的。不过,如果有帮助,我会添加一个链接。
  • iOS?你真的在使用 C 还是 ObjC?
  • openssl 是一个 C 库,因此可以很好地包含在 iOS 中。关于 openssl 的代码是纯 C 代码。
  • @Maggie:FWIW:我感觉到你的痛苦。 OpenSSL API 是迄今为止我遇到过的最糟糕的 API。这是令人厌恶的,在处理完有限的用例后,我很高兴继续前进。

标签: c openssl


【解决方案1】:

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

问候。

【讨论】:

  • 根据link:BIO 是一种 I/O 抽象,它对应用程序隐藏了许多底层 I/O 细节。如果应用程序将 BIO 用于其 I/O,它可以透明地处理 SSL 连接、未加密的网络连接和文件 I/O。
  • 换句话说,BIO 作为任何 I/O 的数据流,包括内存本身。因此,内存 BIO 只是进出内存的流。 BIO 也可以以一种非常有用的方式与 BIO_push() 链接在一起,例如解释 here
  • 这行得通,非常感谢,这是你的 200 声望 :)
【解决方案2】:

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

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

(链接添加我的。)

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

【讨论】:

  • 感谢您的建议,我查看了 SNACC,但现在我坚持使用 openssl 并使用 Felipe 建议的解决方案。
【解决方案3】:

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

【讨论】:

  • 感谢您的建议,我查看了 SNACC,但现在我坚持使用 openssl 并使用 Felipe 建议的解决方案。
猜你喜欢
  • 2017-01-17
  • 2016-06-07
  • 1970-01-01
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 2016-12-28
  • 1970-01-01
相关资源
最近更新 更多