Хорошо, вот сценарий. Компания под названием "Corp" выдает SSL-сертификаты всем своим сотрудникам для доступа к веб-ресурсам Corp. Corp также предоставляет сертификат для своего центра сертификации, чтобы их сотрудники могли установить его в качестве доверенного центра сертификации.
Я создаю инструмент, который находится за пределами сети Corp, но я хотел бы использовать сертификаты SSL, которые установили все сотрудники, чтобы идентифицировать их, когда они используют этот инструмент (поскольку только сотрудники Corp могут использовать этот инструмент). Это работает на Apache 2.2, установленном в дистрибутиве Linux от Amazon. Вот что я пробовал до сих пор:
1) Я создал и самоподписал сертификат SSL для сервера, который будет использовать HTTPS ("privatekey.pem" и "server.crt").
2) Я скопировал сертификат CA Corp на сервер (corp-ca.crt)
3) Я использовал следующую конфигурацию VirtualHost для Apache:
<VirtualHost *:443>
ServerName toolname.thirdparty.com
DocumentRoot /var/www/html
ServerAdmin admin@myemail.com
ErrorLog logs/toolname-error_log
CustomLog logs/toolname-access_log common
<Directory "/var/www/html">
AllowOverride all
</Directory>
SSLEngine On
SSLCertificateFile /etc/ssl/server.crt
SSLCertificateKeyFile /etc/ssl/privatekey.pem
SSLCACertificateFile /etc/ssl/corp-ca.crt
SSLVerifyClient require
SSLVerifyDepth 1
SSLOptions +StdEnvVars
</VirtualHost>
Когда я пытаюсь получить доступ к одному из веб-сайтов корпорации, я могу выбрать из них свой сертификат клиента, и он работает, поэтому я знаю, что сертификат клиента установлен правильно. Когда я делаю это с SSLVerifyClient optional
, страница нормально загружается по HTTPS, поэтому я знаю, что у моего сервера настройка SSL в порядке. С участием SSLVerifyClient required
хотя я получаю ERR_SSL_PROTOCOL_ERROR
говоря:
«Невозможно установить безопасное соединение с сервером. Это может быть проблема с сервером или может потребоваться сертификат аутентификации клиента, которого у вас нет».
Так что возникает вопрос, который я должен задать: возможно ли то, что я пытаюсь сделать? Могу ли я использовать сертификаты клиента, выданные кем-то другим, чтобы подтвердить свою личность на моем собственном сайте? Если это действительно возможно, как бы я это сделал?
Ваша конфигурация кажется правильной, если предположить, что сертификат ЦС, который подписывает ваши клиентские сертификаты, находится в этом файле:
/etc/ssl/corp-ca.crt
Я бы посоветовал вам добавить еще одно направление, вот такое:
SSLCADNRequestFile
Этот shoud указывает на файл, который представляет собой объединение всех CA, которые могут подписывать сертификаты вашего клиента, и еще одно предостережение, см. Эту ошибку apache в этом списке (список приемлемых CA, отправленных из apache клиенту):
https://bz.apache.org/bugzilla/show_bug.cgi?id=12355
Это и тот факт, что центры сертификации могут быть неизвестны браузеру, могут дать вам точное сообщение, которое вы получили.
В этом случае сначала убедитесь, что в браузере установлен сертификат клиента, вам понадобится файл pkcs12, который включает в себя как закрытый ключ, так и сертификат. После этого все должно работать нормально.
Чтобы проверить, так ли это, вы можете использовать curl:
curl -k -E YOUR_CLIENT_CERT.pem --key YOUR_CLIENT_KEY.pem https://toolname.thirdparty.com
-k
потому что в этом случае вы не проверяете сертификат сервера.
Corp, очевидно, имеет корневой сертификат CA, возможно, вместе с промежуточным сертификатом. Таким образом, в этом сценарии вы не можете использовать самозаверяющий сертификат с цепочкой CA Corp. Ваш сертификат должен быть «подписан» корневым или промежуточным сертификатом корпорации, с openssl ca команда.
Таким образом, вы должны отправить CSR администратору корпорации, чтобы вернуть вам подписанный / действительный сертификат для использования с вашим Apache.
Изменить: для получения дополнительной информации вы можете использовать openssl s_client , чтобы увидеть настройки SSL. Например: openssl s_client -connect myextapp.com:443
Вы увидите вывод цепочки сертификатов, которые вы использовали для настройки apache.