Почему экспорт openssl pkcs12 добавляет дополнительный корневой сертификат привязки, дублирующий сертификат сервера в Mac OS X
[Первоначально опубликовано в Slack Overflow, но ветка комментариев жаловалась на неподходящее место.]
Мы работаем над переходом с SSL-сертификатов StartCom на Let's Encrypt и пытаемся настроить его на автоматическую работу с macOS Server + Apache HTTPD. Из инструмента командной строки (security import
), сервер MacOS не принимает прямой .pem
файлы - вы должны дать ему .p12
файл, из которого он извлекает .pem
файлы для настройки в Apache. Раздражает и бессмысленно, но это то, с чем мы должны жить сейчас.
Для того, чтобы создать это .p12
файл, мы должны выполнить эту команду:
openssl pkcs12 -export \
-inkey /etc/letsencrypt/live/example.com/privkey.pem \
-in /etc/letsencrypt/live/example.com/cert.pem \
-certfile /etc/letsencrypt/live/example.com/chain.pem \
-out /etc/letsencrypt/live/example.com/example.com.p12
И вот где это становится странным. Выход example.com.p12
файл имеет example.com
сертификат дважды, за которым следует промежуточный сертификат Let's Encrypt, за которым следует ненужный самозаверяющий сертификат привязки DST Root CA X3 (который по умолчанию установлен во всех браузерах) и, наконец, закрытый ключ. В результате рукопожатие Apache SSL включает в себя сертификат сервера дважды, а также промежуточный сертификат CA и корневой сертификат (который он не должен отправлять), что приводит к появлению предупреждений в тестере Qualys SSL Labs.
Мы заглянули внутрь cert.pem
, и он содержит только сертификат сервера (и только один раз). chain.pem
содержит только промежуточный сертификат CA (не корневой якорь или сертификат сервера). privkey.pem
содержит только закрытый ключ. Так openssl pkcs12 -export
дублирует сертификат сервера, а затем переходит к дополнительному этапу поиска корневого сертификата привязки и добавления его.
Если мы запустим эту же команду в openSUSE Linux, вывод .p12
Файл имеет только сертификат сервера (один раз), промежуточный сертификат CA и закрытый ключ. Нет корневого якоря.
Мы попробовали следующие варианты и не увидели никакой разницы в выходе:
openssl pkcs12 -export \
-inkey /etc/letsencrypt/live/example.com/privkey.pem \
-in /etc/letsencrypt/live/example.com/fullchain.pem \
-out /etc/letsencrypt/live/example.com/example.com.p12
openssl pkcs12 -export \
-inkey /etc/letsencrypt/live/example.com/privkey.pem \
-certfile /etc/letsencrypt/live/example.com/fullchain.pem \
-out /etc/letsencrypt/live/example.com/example.com.p12
Единственный способ, которым я могу продублировать некорректное поведение удвоенного сертификата сервера на компьютере с Linux, - это сделать следующее (но оно по-прежнему не включает в себя корневой якорь):
openssl pkcs12 -export \
-inkey /etc/letsencrypt/live/example.com/privkey.pem \
-in /etc/letsencrypt/live/example.com/cert.pem \
-certfile /etc/letsencrypt/live/example.com/fullchain.pem \
-out /etc/letsencrypt/live/example.com/example.com.p12
(Обратите внимание на использование fullchain.pem
вместо chain.pem
в сочетании с использованием cert.pem
... вполне понятно, почему сертификат сервера будет дублирован, но это не та команда, которую мы используем в Mac OS X.)
Любая идея, как получить openssl pkcs12 -export
сделать правильную вещь здесь?