Загрузите цепочку сертификатов из файла PEM в STACK_OF(X509)* с помощью OpenSSL

Как лучше всего загрузить в память полную цепочку сертификатов из файла PEM, работая с библиотекой OpenSSL в c? Ввод представляет собой один файл 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 контекста.

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


person Daniel Roethlisberger    schedule 20.03.2012    source источник


Ответы (1)


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

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

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

person sirgeorge    schedule 21.03.2012
comment
FTR, OpenSSL 1.0.2, наконец, представил SSL_CTX_get0_chain_certs() для доступа к дополнительным сертификатам. - person Daniel Roethlisberger; 03.07.2015
comment
Я не мог заставить это работать на меня. У меня была цепочка, которую openssl распознал в командной строке, SSL_CTX_use_certificate_chain_file загрузил бы без ошибок, но тогда extra_certs было бы пусто! В итоге я загрузил файл в память, разобрал его на части и загрузил каждый сертификат вручную, используя PEM_read_bio_X509. :( - person Max; 08.04.2020