2013-04-12 3 views

ответ

2

Вы можете использовать X509_NAME_delete_entry() функцию для этого:

X509_NAME_delete_entry() удаляет запись из названия в положении LOC. Удаленная запись возвращается и должна быть освобождена.

Man страница: http://linux.die.net/man/3/x509_name_delete_entry

Edit:

Чтобы действительно получить и удалить расширение, вы можете использовать следующие функции:

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 
} 
+0

Thats для выдающегося имени, не так ли? subjectNameAlt не является частью отличительного имени, его частью расширений x509v3. – chacham15

+0

Да, вы правы. X509_NAME_delete_entry() работает только с полями информации сертификата. – Paul

+0

Обновлен мой комментарий на примере того, как работать с расширениями сертификатов. Надеюсь, поможет ! – Paul

0

Ответ на chacham15 неверен. Как заявил the documentation:

X509v3_get_ext()X509_get_ext()] извлекает расширение LOC из 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 
} 
+0

Был ли ответ чачама правильным 4+ года назад? –

+0

Im confused ... «правильный» способ, который вы написали, выглядит идентично примеру из отмеченного ответа. – chacham15

Смежные вопросы