我正在使用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≠%£甲
答案 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线程中关键用法扩展的解决方法,但每种扩展的方法都是相同的。
问候。