【发布时间】: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。这是令人厌恶的,在处理完有限的用例后,我很高兴继续前进。