2012-03-20 2 views
1

Работа с библиотекой OpenSSL в c, что является лучшим способом загрузить полную цепочку сертификатов из файла PEM в память? Вход представляет собой один файл PEM с конкатенированными сертификатами 1..n, вывод должен быть STACK_OF(X509)*.Загрузить цепочку сертификатов из файла PEM в STACK_OF (X509) * с использованием OpenSSL

Для отдельных сертификатов, самый простой способ, чтобы загрузить их следующим образом:

SSL_CTX *sslctx = SSL_CTX_new(SSLv23_server_method()); 
SSL_CTX_use_certificate_file(sslctx, "certificate.pem", SSL_FILETYPE_PEM); 
SSL *ssl = SSL_new(sslctx); 
X509 *crt = SSL_get_certificate(ssl); 

(обработка ошибок, освобождение ресурсов и подсчет ссылок опущены для ясности; с использованием синтаксиса C99; «простой», что означает «избегать более низкого уровня BIO и ASN.1 API-интерфейсы ")

Однако для полных цепочек сертификатов, SSL_CTX_use_certificate_chain_file() может использоваться, чтобы загрузить их в SSL_CTX и первый сертификат может быть получен с помощью SSL_get_certificate(), но там, кажется, нет API function для извлечения остальную часть цепи сертификата с SSL контекст.

Так что же лучший способ загрузить цепочку сертификатов из файла?

ответ

3

Функция SSL_CTX_use_certificate_chain_file помещает сертификат в SSL_CTX::cert и всех дополнительные сертификаты в цепочке (дополнительный CA cetrificates) в SSL_CTX::extra_certs, какой типом является STACK_OF(X509)*, поэтому, чтобы получить вашу дополнительную цепочку:

STACK_OF(X509)* ca_stack = sslctx->extra_certs; 

Я не мог найти макрос или функцию, которая может дать вам поле extra_cets, не обращаясь к нему напрямую в структуре SSL_CTX, но, глядя на код OpenSSL, он обращается к нему напрямую повсюду.

+0

FTR, OpenSSL 1.0.2, наконец, представил SSL_CTX_get0_chain_certs() для доступа к дополнительным сертификатам. –

+0

@ Daniel Roethlisberger, спасибо, хорошо знать – sirgeorge

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