Я не совсем уверен, каков точный вариант использования.
Я могу вспомнить два возможных случая:
- Ваш клиент хочет поддерживать клиентские сертификаты на основеаутентификация. Поэтому им нужно просто предоставить файл сертификата для каждого клиента, который ваш скрипт должен автоматически добавить в склад доверенных сертификатов вместе с извлеченными промежуточными и корневыми сертификатами.
- Ваш клиент хочет поддерживать несколько сертификатов сервера на одной установке сервера (например, несколько
SSLHostConfig
) или на разных установках. Поэтому им нужен способ автоматизации конфигурации сертификата сервера, просто предоставив один файл сертификата сервера вашему сценарию, который может снова потребовать извлечения промежуточного и корневого файлов для отправки клиентам во время рукопожатия https.
Ваш вопрос ниже может относиться к обоим случаям:
"Возможно ли извлечь корневой и промежуточный сертификат из основного сертификата."
Сертификат может быть предоставлен вашим клиентом в виде файла подписи следующими способами:
- Файл, содержащий несколько сертификатов x509 PEM / DER, образующих цепочку сертификатов. например, сам сертификат, промежуточный и корневой каталог и, возможно, закрытый ключ.
- Хранилище ключей (JKS или P12), содержащее вышеуказанную цепочку сертификатов и, возможно, закрытый ключ.
- Файл, содержащийодин сертификат PEM / DER
Ответ:
В первых двух случаях вы можете легко извлечь промежуточный и корневой сертификаты, поскольку они содержатся внутри этого единственного файла.
В последнем случае информация, содержащаяся в сертификате для родительского элемента (например, промежуточного сертификата), представляет собой Issuer:
информация, которая сама по себе не является сертификатом.
Один из возможных способов для получения сертификата эмитента в этом случае - чтение CA Issuers
ссылки из Authority Information Access (AIA)
расширение (если оно присутствует в сертификате) и затем извлечение сертификата оттуда.
Для доверия клиентским сертификатам ваш скрипт должен добавить сертификат и т. он (предоставляется или извлекается динамически), промежуточный и корень по отношению к хранилищу доверенных сертификатов, один за другим.
Для сертификата на стороне сервера необходимо сформировать цепочку, содержащую промежуточный и корневой (предоставленный или извлеченный динамически), добавить этот и приватныйключ от хранилища ключей.