基于mbedTLS提取证书中主体密钥标识符扩展的技术咨询
在mbedTLS中提取证书主体密钥标识符扩展的方案
问题解答
a) 基于v3_ext的解析是否为唯一且正确的选择?
不是唯一选择,但属于正确的可行方案。v3_ext确实存储了证书的所有X.509 v3扩展,通过ASN.1解析定位OID为2.5.29.14的主体密钥标识符,是符合X.509标准的做法。不过mbedTLS的内部结构还有其他可利用的路径,所以这并非唯一解。
b) 是否存在更优方案?
有两种更简洁可靠的方案,比直接解析v3_ext更省心:
循环调用
mbedtls_x509_get_ext遍历扩展:你提到缺少偏移量,其实可以从偏移量0开始循环调用该函数,直到找到目标OID或遍历结束。复用mbedTLS的内部解析逻辑,无需自己写ASN.1解析代码,示例逻辑如下:int ret; size_t ext_len; unsigned char *ext_data; size_t offset = 0; const char *ski_oid = "2.5.29.14"; do { ret = mbedtls_x509_get_ext(&cert->cert, ski_oid, strlen(ski_oid), &offset, &ext_data, &ext_len); if(ret == 0) { // 找到主体密钥标识符,ext_data和ext_len对应数据 break; } } while(ret == MBEDTLS_ERR_X509_EXT_NOT_FOUND);使用官方提供的直接API(版本支持时):检查你的mbedTLS版本,2.28及以上的版本已经提供了
mbedtls_x509_crt_get_subject_key_id函数,直接调用即可完成提取,这是最优解。函数原型示例:int mbedtls_x509_crt_get_subject_key_id(const mbedtls_x509_crt *crt, unsigned char *buf, size_t buf_len, size_t *out_len);
内容的提问来源于stack exchange,提问作者k_o_
相关产品推荐
相关产品推荐

