如何从X509中删除扩展?

时间:2013-04-12 18:51:19

标签: c openssl x509

我正在创建一个api来修改C中的X509证书,我想添加一种删除扩展名的方法(例如subjectNameAlt)。我如何通过OpenSSL API执行此操作?

2 个答案:

答案 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
}