Загрузка цепочки сертификатов из файла PEM в STACK_OF (X509) * с использованием OpenSSL - PullRequest
1 голос
/ 21 марта 2012

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

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

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; «легкий» означает «избегать API-интерфейсов BIO и ASN.1 низкого уровня»)

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

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

1 Ответ

3 голосов
/ 21 марта 2012

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

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

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

...