Назад | Перейти на главную страницу

Почему я не могу использовать сертификаты SSL, импортированные через Server Admin, в настраиваемой установке Apache?

У меня есть пара веб-серверов Mac OS X 10.6.8 Server, на которых установлен собственный стек AMP255 (Apache 2.x, MySQL 5.x и PHP 5.x) с использованием MacPorts. У нас есть много серверов Mac OS X Server, и мы обычно устанавливаем сертификаты SSL через Server Admin, и они «просто работают» во встроенных службах, однако на этих веб-серверах сертификаты SSL всегда устанавливались в нестандартном месте. и используется только для Apache.

Короче говоря, мы пытаемся стандартизировать эту часть нашего администрирования и устанавливать сертификаты через Server Admin, но столкнулись со следующей проблемой: когда сертификаты устанавливаются через Server Admin и упоминаются в наших файлах конфигурации Apache, Apache затем запрашивает пароль при попытке запуска. Кажется, это не какой-либо пароль, который мы знаем, и уж тем более пароли администратора или связки ключей! Мы добавили _www пользователь к certusers (в основном, чтобы убедиться, что у них есть надлежащий доступ к закрытому ключу в /etc/certificates/).

Итак, с настраиваемыми установленными сертификатами у нас есть следующие файлы (в основном, просто вставленные из компании, у которой мы покупаем наши сертификаты):

-rw-r--r--   1 root  admin  1395 Apr 10 11:22 *.domain.tld.ca
-rw-r--r--   1 root  admin  1656 Apr 10 11:21 *.domain.tld.cert
-rw-r--r--   1 root  admin  1680 Apr 10 11:22 *.domain.tld.key

И следующее в VirtualHost в /opt/local/apache2/conf/extra/httpd-ssl.conf:

SSLCertificateFile /path/to/certs/*.domain.tld.cert
SSLCertificateKeyFile /path/to/certs/*.domain.tld.key
SSLCACertificateFile /path/to/certs/*.domain.tld.ca

Эта установка работает нормально.

Если мы используем сертификаты, установленные через Server Admin, которые и Server Admin, и Keychain Assistant показывают как действительные, они установлены в /etc/certificates/ следующим образом:

-rw-r--r--    1 root  wheel      1655 Apr  9 13:44 *.domain.tld.SOMELONGHASH.cert.pem
-rw-r--r--    1 root  wheel      4266 Apr  9 13:44 *.domain.tld.SOMELONGHASH.chain.pem
-rw-r-----    1 root  certusers  3406 Apr  9 13:44 *.domain.tld.SOMELONGHASH.concat.pem
-rw-r-----    1 root  certusers  1751 Apr  9 13:44 *.domain.tld.SOMELONGHASH.key.pem

И если мы заменим вышеупомянутые строки в нашем httpd-ssl.conf со следующим:

SSLCertificateFile /etc/certificates/*.domain.tld.SOMELONGHASH.cert.pem
SSLCertificateKeyFile /etc/certificates/*.domain.tld.SOMELONGHASH.key.pem
SSLCertificateChainFile /etc/certificates/*.domain.tld.SOMELONGHASH.chain.pem

Это запрашивает неизвестный пароль. Я тоже пробовал httpd-ssl.conf настроен следующим образом:

SSLCertificateFile /etc/certificates/*.domain.tld.SOMELONGHASH.cert.pem
SSLCertificateKeyFile /etc/certificates/*.domain.tld.SOMELONGHASH.key.pem
SSLCertificateChainFile /etc/certificates/*.domain.tld.SOMELONGHASH.concat.pem

И, как:

SSLCertificateFile /etc/certificates/*.domain.tld.SOMELONGHASH.cert.pem
SSLCertificateKeyFile /etc/certificates/*.domain.tld.SOMELONGHASH.key.pem
SSLCACertificateFile /etc/certificates/*.domain.tld.SOMELONGHASH.chain.pem

Мы проверили, что сертификат настроен так, чтобы все приложения могли получить к нему доступ (в Keychain Assistant). Разница в /etc/certificates/*.domain.tld.SOMELONGHASH.key.pem & *.domain.tld.key files показывает, что первое зашифровано, а второе - нет, поэтому мы предполагаем, что администратор сервера / помощник по цепочке ключей по какой-то причине их шифрует.

Я знаю, что могу создать незашифрованный ключевой файл следующим образом:

sudo openssl rsa -in /etc/certificates/*.domain.tld.SOMELONGHASH.key.pem -out /etc/certificates/*.domain.tld.SOMELONGHASH.key.no_password.pem

Но я не могу этого сделать, не введя пароль. Я подумал, может быть, я смогу экспортировать незашифрованную копию ключа из Keychain Admin, но я не вижу такой опции (не говоря уже о том, что .pem во всех вариантах экспорта выделены серым цветом).

Будем очень благодарны любой помощи.

Как намекнул Шейн в комментариях, можно экспортировать сертификат как PKCS # 12 (.p12) из Keychain Access (с паролем или без него, естественно, защита паролем на этом этапе более безопасна). Для этого вы должны сначала запустить Keychain Access от имени пользователя root, поэтому sudo /Applications/Utilities/Keychain\ Access.app/Contents/MacOS/Keychain\ Access &. Оттуда я смог запустить следующие команды, чтобы извлечь закрытый ключ из экспортированного .p12 файл без шифрования и поместите его вместе с зашифрованным ключом в /etc/certificates/:

sudo openssl pkcs12 -in *.domain.tld.p12 -out /etc/certificates/*.domain.tld.SOMELONGHASH.key.no_password.pem -nodes -nocerts
sudo chown root:certusers /etc/certificates/*.domain.tld.SOMELONGHASH.key.no_password.pem
sudo chmod 640 /etc/certificates/*.domain.tld.SOMELONGHASH.key.no_password.pem

Итак, теперь у меня есть следующие файлы в /etc/certificates/:

-rw-r--r--    1 root  wheel      1655 Apr  9 13:44 *.domain.tld.SOMELONGHASH.cert.pem
-rw-r--r--    1 root  wheel      4266 Apr  9 13:44 *.domain.tld.SOMELONGHASH.chain.pem
-rw-r-----    1 root  certusers  3406 Apr  9 13:44 *.domain.tld.SOMELONGHASH.concat.pem
-rw-r-----    1 root  certusers  1867 Apr 11 08:30 *.domain.tld.SOMELONGHASH.key.no_password.pem
-rw-r-----    1 root  certusers  1751 Apr  9 13:44 *.domain.tld.SOMELONGHASH.key.pem

Я обновил свой httpd-ssl.conf файл в:

SSLCertificateFile /etc/certificates/*.domain.tld.SOMELONGHASH.cert.pem
SSLCertificateKeyFile /etc/certificates/*.domain.tld.SOMELONGHASH.key.no_password.pem
SSLCertificateChainFile /etc/certificates/*.domain.tld.SOMELONGHASH.chain.pem

Перезагрузил Apache, и он отлично работает.

Я пропустил эту часть в своем первоначальном вопросе, но чтобы убедиться, что _www пользователь добавлен в certusers group (которая требуется Apache для чтения закрытого ключа, поскольку я сохранил эти разрешения), я использовал следующую команду:

sudo dseditgroup -o edit -a _www -t user certusers

Экспортируйте сертификат как .p12. Запишите используемый пароль.

Вытащить открытый ключ из .p12 файл - он запросит пароль, который был только что установлен при экспорте.

openssl pkcs12 -in /path/to/exported/cert.p12 -out /etc/certificates/new.pem -nokeys

Проверьте, сколько сертификатов сейчас в выходном файле; вы можете открыть его в любом текстовом редакторе - это может быть просто сертификат субъекта, или он может содержать всю цепочку (сертификаты в .ca файл, предоставленный вашим центром сертификации). Если у него есть вся цепочка, ничего страшного - Apache без проблем примет все это в одном файле. Если нет, то продолжайте использовать файл цепочки, который они вам дали.

Затем давайте также извлечем закрытый ключ:

openssl pkcs12 -in /path/to/exported/cert.p12 -out /etc/certificates/new.key -nocerts -nodes

Обратите внимание, что -nodes флаг указывает команде не использовать шифрование для закрытого ключа; это предотвратит запрос пароля Apache.

Укажите Apache на эти новые файлы и перезапустите. Должно быть хорошо!