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

Не удается заставить httpd использовать правильный SSL

У меня есть подписанный сертификат 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, и тот, который был определен в настройке по умолчанию вашего дистрибутива, имеет приоритет.