У меня есть сервер CentOS 6 с Apache 2.2.15 с OpenSSL 1.0.1e-fips. Я пытаюсь настроить двустороннюю SSL-аутентификацию для определенного места в моем корневом веб-каталоге. Третья сторона предоставила как открытый (текстовый), так и частный (двоичный) сертификат.
Мне нужно руководство о том, как включить как общедоступные, так и частные сертификаты, чтобы установить связь, так как я получаю следующую ошибку:
Не удалось выполнить повторное согласование: не принято клиентом !?
Вот что у меня в файле /etc/httpd/conf.d/ssl.conf, относящемся к этому разделу:
<Location /api/path/>
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCACertificateFile /etc/pki/tls/private/public.cer
SSLVerifyClient require
SSLVerifyDepth 10
SSLOptions +StdEnvVars +ExportCertData +OptRenegotiate
</Location>
По общему признанию, я не эксперт по SSL. Я знаю достаточно, чтобы сертификаты были установлены и работали. Я переключил logginf на уровень «отладки». Я пытался следовать этим руководствам:
http://www.stefanocapitanio.com/configuring-two-way-authentication-ssl-with-apache/
Заранее спасибо!
Полный файл ssl.conf:
LoadModule ssl_module modules/mod_ssl.so
Listen 443
SSLPassPhraseDialog builtin
SSLSessionCache shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout 300
SSLMutex default
SSLRandomSeed startup file:/dev/urandom 256
SSLRandomSeed connect builtin
#SSLRandomSeed startup file:/dev/random 512
#SSLRandomSeed connect file:/dev/random 512
#SSLRandomSeed connect file:/dev/urandom 512
SSLCryptoDevice builtin
#SSLCryptoDevice ubsec
<VirtualHost *:443>
DocumentRoot "/var/www/html/staging-site"
ServerName staging.site.com:443
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel debug
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
SSLCertificateFile /etc/pki/tls/certs/cert.crt
SSLCertificateKeyFile /etc/pki/tls/private/private.key
#SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt
SSLCACertificateFile /etc/pki/tls/certs/rapidssl.crt
#SSLVerifyClient require
#SSLVerifyDepth 10
# Access Control:
#<Location />
#SSLRequire ( %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \
# and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \
# and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \
# and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \
# and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20 ) \
# or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/
#</Location>
<Location /path/api/>
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCACertificateFile /etc/pki/tls/private/3rdpartyprivate.cer
SSLVerifyClient require
SSLVerifyDepth 10
SSLOptions +StdEnvVars +ExportCertData +OptRenegotiate
</Location>
# SSL Engine Options:
#SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
# SSL Protocol Adjustments:
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
# Per-Server Logging:
CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
Я думаю, вы используете неправильные сертификаты в неправильном месте. Вы должны использовать сертификат сервера, выданный доверенным центром сертификации в SSLCertificateFile
(сертификат в формате PEM), SSLCertificateKeyFile
(введите формат PEM, соответствующий сертификату), и SSLCertificateChainFile
(сертификаты, начиная с сертификата эмитента сертификата хоста и заканчивая корневым сертификатом в формате PEM).
В SSLCACertificateFile
вы должны использовать сертификат (также в формате PEM) центра сертификации, который подписал сертификаты клиентов.
Вот полный пример. Имейте в виду, что я использую сертификат сервера, подписанный тем же центром сертификации, который подписывает для этого сертификаты клиентов. Отрегулируйте, если ваши потребности отличаются.
Генерация сертификатов
openssl genrsa -des3 -out ca.key 4096
openssl req -new -x509 -days 365 -key ca.key -out ca.crt -subj "/C=US/ST=Some State/L=FancyTown/O=SomeOrg/CN=Self-Signed CA"
openssl genrsa -out client.key 4096
openssl req -new -key client.key -out client.csr -subj "/C=US/ST=Some State/L=FancyTown/O=SomeOrg/CN=client"
openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt
openssl genrsa -out server.key 4096
openssl req -new -key server.key -out server.csr -subj "/C=US/ST=Some State/L=FancyTown/O=SomeOrg/CN=server"
openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 02 -out server.crt
Перемещение их в более удобное место
mkdir /etc/ssl_ ; mv * /etc/ssl_
Установите веб-сервер и mod_ssl
yum install -y httpd mod_ssl
Очистить конфигурацию TLS по умолчанию
truncate -s0 /etc/httpd/conf.d/ssl.conf
Общая конфигурация TLS для всех VHosts, /etc/httpd/conf.d/00-ssl.conf
Модули LoadModule ssl_module / mod_ssl.so
Слушайте 443 https SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt SSLStaplingCache shmcb: / run / httpd / stapling_cache (128000) SSLUseStapling off
SSLPassPhraseDialog exec: / usr / libexec / httpd-ssl-pass-dialog SSLSessionCache shmcb: / run / httpd / sslcache (512000) SSLSessionCacheTimeout 300 Файл запуска SSLRandomSeed: / dev / urandom 256 Встроенный SSLRandomSeed connect, встроенный SSLCryptoDevice
SSLStrictSNIVHostПроверьте SSLProtocol + TLSv1.2 -TLSv1.1 -TLSv1 -SSLv3 SSLHonorCipherOrder on
SSLCompression off SSLCipherSuite ECDHE-RSA-AES256-GCM-SHA384: ECDHE-RSA-AES256-SHA384: ECDHE-RSA-AES128-GCM-SHA256: ECDHE-RSA-AES128-SHA256: -ECDHE-RSA-SHA256: -ECDHE-RSA RSA-AE S256-SHA: DHE-RSA-AES256-GCM-SHA384: DHE-RSA-AES256-SHA256: DHE-RSA-AES128-GCM-SHA256: DHE-RSA-AES128-SHA256: DHE-RSA-AES256-SHA : DHE-RSA-AES128-SHA: -RC4-SHA: AES256- GCM-SHA384: AES256-SHA256: CAMELLIA256-SHA: ECDHE-RSA-AES128-SHA: AES128-GCM-SHA256: AES128-SHA8256: AES КАМЕЛИЯ128-ША ''
/etc/httpd/conf.d/50-ssl-vhost.conf
`` `` ServerAlias localhost.localdomain localhost ServerName server SSLEngine на SSLCertificateFile /etc/_ssl/server.crt SSLCertificateKeyFile /etc/_ssl/server.key SSLCertificateChainFile /etc/_ssl/ca.crt SSLCACetcertificate_File/
SSLVerifyClient require
SSLVerifyDepth 10
DocumentRoot /var/www/html
<Directory /var/www/html>
Require all granted
</Directory>
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
`` ''
Создать index.html
файл для тестирования echo 'It works\!' > /var/www/html/index.html
Запустить httpd
systemctl enable --now httpd
echo '127.0.1.1 server' >> /etc/hosts
Это работает (auth ok): ( echo -en 'GET / HTTP/1.1\r\nHost: server\r\n\r\n' ; sleep 2) | openssl s_client -CAfile /etc/_ssl/ca.crt -cert /etc/_ssl/client.crt -key /etc/_ssl/cli
ent.key -connect server:443 -servername server
Это не так, мы не предоставили правильный сертификат:
( echo -en 'GET / HTTP/1.1\r\nHost: server\r\n\r\n' ; sleep 2) | openssl s_client -CAfile /etc/_ssl/ca.crt -connect server:443 -servername server
В нашей ситуации мы внесли три изменения:
Раскомментируйте SSLCertificateChainFile и установите для него файл цепочки сертификатов RapidSSL (который выдал наш сертификат).
Изменен SSLCACertificateFile на файл цепочки ЦС стороннего эмитента (который выдает свой сертификат).
Из директивы удален SSLCACertificateFile.
После того, как мы изменили их и перезапустили, двусторонняя аутентификация заработала, и они смогли получить доступ к API.
Спасибо @fuero за помощь.