У меня есть пара веб-серверов 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 на эти новые файлы и перезапустите. Должно быть хорошо!