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

Двусторонняя SSL-аутентификация с Apache 2.2 и OpenSSL 1.0.1e-fips

У меня есть сервер 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/

http://www.cafesoft.com/products/cams/ps/docs32/admin/ConfiguringApache2ForSSLTLSMutualAuthentication.html

Заранее спасибо!

Полный файл 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-ША ''

  • Конфигурация VHost /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

В нашей ситуации мы внесли три изменения:

  1. Раскомментируйте SSLCertificateChainFile и установите для него файл цепочки сертификатов RapidSSL (который выдал наш сертификат).

  2. Изменен SSLCACertificateFile на файл цепочки ЦС стороннего эмитента (который выдает свой сертификат).

  3. Из директивы удален SSLCACertificateFile.

После того, как мы изменили их и перезапустили, двусторонняя аутентификация заработала, и они смогли получить доступ к API.

Спасибо @fuero за помощь.