Почему экспорт openssl pkcs12 добавляет дополнительный корневой сертификат привязки, дублирующий сертификат сервера в Mac OS X

572
Nick Williams

[Первоначально опубликовано в 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сертификат дважды, за ним следует промежуточный сертификат 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правильные вещи здесь?

1
Вы пытались установить и запустить современную версию OpenSSL (возможно, через MacPorts или Homebrew)? У Apple есть своя собственная библиотека безопасности, и она давно не проявляла к OpenSSL никакой любви. Spiff 6 лет назад 0
Мы еще не пробовали это. Я с осторожностью относился к обновлению OpenSSL в иначе работающей конфигурации, которая прошла проверку безопасности. Тем не менее, `OpenSSL 0.9.8zh 14 января 2016` не * такой * старый ... Nick Williams 6 лет назад 0
«В High Sierra Apple переключила библиотеки SSL с OpenSSL 0.9.8zh на LibreSSL 2.2.7. LibreSSL - это форк OpenSSL, поддерживаемый OpenBSD. Безопасный транспорт - это собственный API Apple для SSL / TLS, но он в основном используется для их собственного программного обеспечения. LibreSSL будет служить библиотекой SSL для стороннего программного обеспечения. Это не было включено ни в какие сеансы WWDC, но наблюдалось пользователями бета-версии High Sierra ». (Https://www.thesslstore.com/blog/crypto-ssl-improvements-high-sierra-ios-11/) Nick Williams 6 лет назад 0
`openssl version` выдает` OpenSSL 0.9.8zh 14 января 2016` на моем локальном компьютере под управлением Sierra, но на самом деле выдает `LibreSSL 2.2.7` на сервере, на котором работает этот скрипт сертификата (High Sierra). Так что, возможно, это ошибка в LibreSSL? Я должен обновить заголовок и теги, но сначала я протестирую их сегодня вечером, чтобы увидеть, отличается ли поведение. Nick Williams 6 лет назад 0

0 ответов на вопрос