У меня есть подписанный сертификат CA, выданный моим университетом. Я сгенерировал свой CSR, используя их файл с открытым ключом:
openssl genrsa -out myservername.key 2048 (new key)
openssl req -new -key myservername.key -out myservername.csr
Я отправил им CSR, они отправили мне обратно подписанный файл .crt.
Я создал каталог для своих ключей и сертификатов CA и поместил их туда.
Соответствующая часть моего httpd.conf выглядит так:
<VirtualHost _default_:443>
SSLEngine on
SSLCACertificateFile /var/cosign/certs/CA/publickey.pem
SSLCertificateFile /var/cosign/certs/myserver.crt
SSLCertificateKeyFile /var/cosign/certs/myserver.key
DocumentRoot /var/www/html/
<Directory /var/www/html>
Options -Indexes
AllowOverride All
</Directory>
Но он не использует этот сертификат для SSL. Если я выполню эту команду:
openssl s_client -connect localhost:443 -showcerts
Я получаю это:
CONNECTED(00000003)
depth=0 C = --, ST = SomeState, L = SomeCity, O = SomeOrganization, OU = SomeOrganizationalUnit, CN = portcharlotte, emailAddress = root@portcharlotte
verify error:num=18:self signed certificate
verify return:1
depth=0 C = --, ST = SomeState, L = SomeCity, O = SomeOrganization, OU = SomeOrganizationalUnit, CN = portcharlotte, emailAddress = root@portcharlotte
verify return:1
---
Certificate chain
Моя CSR содержала правильные подробности, а не эту чушь SomeState, SomeCity, которая, как я предполагаю, используется по умолчанию.
Модуль openssl установлен и загружен.
Единственные ошибки, которые я регистрирую в журналах:
[Fri Jan 25 13:27:40 2013] [warn] RSA server certificate is a CA certificate (BasicConstraints: CA == TRUE !?)
[Fri Jan 25 13:27:40 2013] [warn] RSA server certificate CommonName (CN) `portcharlotte' does NOT match server name!?
Я предполагаю, что это несоответствие связано с неправильным сертификатом.
У меня вопрос, как заставить его использовать правильный? Что мне не хватает?
SSLCACertificateFile /var/cosign/certs/CA/publickey.pem
Если этот файл PEM действительно не содержит сертификат CA для клиент сертификаты, которым вы хотите предоставить доступ, это неверно; чтобы предоставить apache с цепочкой сертификатов, используйте SSLCertificateChainFile
вместо.
Apache должен иметь фактический сертификат и любые промежуточные сертификаты, используемые для подписи / создания сертификата конечной точки, вплоть до корневого сертификата, которому доверяют браузеры.
Чтобы проверить сертификат, который они вам дали, запустите:
openssl verify -CApath /path/to/CA/certs -purpose sslserver -verbose /your/certificate
Помимо проблем с сертификатом, вам не хватает SSLRequireSSL
директива в вашем хосте; без него apache не будет проверять безопасное соединение.
Вы также не должны использовать _default_
как виртуальный хост, и вам не хватает ServerName
.
В качестве виртуального хоста используйте *: 443 или IP: 443.
У каждого виртуального хоста должно быть задано допустимое имя сервера, и, кроме того, у виртуального хоста SSL должно быть имя сервера, соответствующее CN сертификата.
Например:
<VirtualHost 1.2.3.4:443>
ServerName your.certificates.common.name
ServerAlias any.subject.alternate.names
DocumentRoot /your/protected/content
SSLEngine On
SSLCertificateChainFile /path/to/your/issuers/CA/cert/bundle
SSLCertificateFile /path/to/your/certificate.crt
SSLCertificateKeyfile /path/to/your/private.key
-OR-
SSLCertificateFile /path/to/your/combined.cert-and-keyfile
SSLRequireSSL
</VirtualHost>
Бегать
# Debian/Ubuntu
apache2ctl -S
# RHEL/CentOS
httpd -S
Должно получиться что-то вроде этого:
*:443 is a NameVirtualHost
default server hostname (/etc/apache2/sites-enabled/000-default:1)
port 443 namevhost hostname (/etc/apache2/sites-enabled/000-default:1)
Убедитесь, что вы запускаете команду openssl с правильным именем хоста для доступа к вашему vhost, я предполагаю, что у вас есть несколько vhosts для порта 443, и тот, который был определен в настройке по умолчанию вашего дистрибутива, имеет приоритет.