我正在创建一个api来修改C中的X509
证书,我想添加一种删除扩展名的方法(例如subjectNameAlt
)。我如何通过OpenSSL API执行此操作?
答案 0 :(得分:2)
您可以使用X509_NAME_delete_entry ()
功能:
X509_NAME_delete_entry()从位置loc的名称中删除一个条目。 将返回已删除的条目,并且必须将其释放。
手册页:http://linux.die.net/man/3/x509_name_delete_entry
修改强>
要实际获取和删除扩展程序,您可以使用以下功能:
X509_EXTENSION *X509_delete_ext(X509 *x, int loc);
示例:强>
int idx = X509_get_ext_by_NID( cert, nid, -1 ); //get the index
X509_EXTENSION *ext = X509_get_ext(cert, idx); //get the extension
if (ext != NULL){ //check that the extension was found
X509_delete_ext(cert, idx); //delete the extension
X509_EXTENSION_free(ext); //free the memory
}
答案 1 :(得分:1)
保罗的回答是释放从X509_get_ext返回的指针,文档明确表示不要这样做..正如the documentation所述:
X509v3_get_ext()
[和X509_get_ext()
]从x
检索扩展位置。 索引loc可以取0到X509_get_ext_count(x) - 1
之间的任何值。 返回的扩展名是一个内部指针,不能是 由应用程序释放。
免费扩展的正确方法如下:
int idx = X509_get_ext_by_NID( cert, nid, -1 ); //get the index
X509_EXTENSION *ext = X509_get_ext(cert, idx); //get the extension
if (ext != NULL){ //check that the extension was found
X509_EXTENSION *tmp = X509_delete_ext(cert, idx); //delete the extension
X509_EXTENSION_free(tmp); //free the memory
}