How extract all OIDs from certificate with OpenSSL
我有一个问题,不知道如何解决。我有一个X.509v3证书,在
例如,我在ExtendedKeyUsage扩展中创建了带有3个标记的证书:
1 | "clientAuth, 1.3.6.1.5.5.7.3.103, timeStamping" |
现在我尝试用
现在我像这样从AKey1_OCTET_STRING中提取来自ExtendedKeyUsage的原始数据:
1 2 3 4 5 6 7 8 9 10 11 | int size; unsigned char *data; ASN1_OCTET_STRING *os; X509_EXTENSION *ext; // extracting data from certificate extension ext = X509_get_ext(cert, 2); os = X509_EXTENSION_get_data(ext); size = ASN1_STRING_length(os); data = ASN1_STRING_data(os); |
这是
如果我使用外部工具解码此十六进制字符串,则会得到以下信息:
1 2 3 4 5 6 | Offset|Length|LenByte| ======+======+=================================================== 0| 30| 1| SEQUENCE : 2| 8| 1| OBJECT_IDENTIFIER : '1.3.6.1.5.5.7.3.2' (id-kp-clientAuth) 12| 8| 1| OBJECT_IDENTIFIER : '1.3.6.1.5.5.7.3.103' 22| 8| 1| OBJECT_IDENTIFIER : '1.3.6.1.5.5.7.3.8' (id-kp-timeStamping) |
我的OID可用,但是如何在OpenSSL中提取此OID?我可以解析它吗...以及如何解析? :(
先谢谢您。
我找到了解决方法!
这是我的快速拨号代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | // optional: we can set an OID name OBJ_create("1.3.6.1.5.5.7.3.103","myObjectShortName","myObjectLongName"); // find the extendedKeyUsage int extIndex = X509_get_ext_by_NID(cert, NID_ext_key_usage, -1); if (extIndex < 0) std::cerr <<"extendedKeyUsage is not present"; // get the correct X.509 extension X509_EXTENSION *ext = X509_get_ext(cert, extIndex); if (!ext) std::cerr <<"'ext' is a nullptr"; // get the extendedKeyUsage EXTENDED_KEY_USAGE *eku = static_cast<EXTENDED_KEY_USAGE*>(X509V3_EXT_d2i(ext)); if (!eku) std::cerr <<"'eku' is a nullptr"; // print all OIDs for (int i = 0; i < sk_ASN1_OBJECT_num(eku); i++) { char buffer[100]; OBJ_obj2txt(buffer, sizeof(buffer), sk_ASN1_OBJECT_value(eku, i), 1); // get OID std::cout <<"eku flag" << i <<":" << buffer <<"\\t -"; std::cout << OBJ_nid2ln(OBJ_obj2nid(sk_ASN1_OBJECT_value(eku, i))) << std::endl; // get OID name } // free used resource if (eku) EXTENDED_KEY_USAGE_free(eku); |
输出:
1 2 3 | eku flag 0: 1.3.6.1.5.5.7.3.2 - TLS Web Client Authentication eku flag 1: 1.3.6.1.5.5.7.3.103 - myObjectLongName eku flag 2: 1.3.6.1.5.5.7.3.8 - Time Stamping |
也许这段代码可以帮助其他人