[Первоначально опубликовано в Slack Overflow, но ветка комментариев жаловалась на неподходящее место.]
Мы работаем над переходом с SSL-сертификатов StartCom на Let's Encrypt и пытаемся настроить его на автоматическую работу с macOS Server + Apache HTTPD. Из командной строки (security import
) macOS Server не принимает прямые файлы .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
два раза, а затем сертификат Шифрование промежуточного ЦС Выпускаемое, за ними следует ненужному самоподписному 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
сделать правильные вещи здесь?