Избирательная ошибка ERR_SSL_VERSION_OR_CIPHER_MISMATCH с несколькими Apache размещенными сайтами - PullRequest
1 голос
/ 27 февраля 2020

У меня есть несколько имен хостов, работающих на Apache, для которых я хотел бы указать c сильную конфигурацию TLS. В Apache включено 2 .conf файлов: первый содержит все виртуальные хосты для порта 80 (скажем, default.conf), а другой хранит соответствующие виртуальные хосты для порта 443 (default443.conf).

Можно получить доступ только к имени хоста с самого первого VirtualHost из default.conf через https://. Все остальные хосты выбрасывают ERR_SSL_VERSION_OR_CIPHER_MISMATCH в любом веб-браузере. При доступе к такому ошибочному имени хоста через curl появляется следующая ошибка:

curl: (35) ошибка: 14094410: подпрограммы SSL: ssl3_read_bytes: ошибка квитирования оповещения sslv3

default.conf:

Protocols h2 h2c http/1.1

<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/html/example
RewriteEngine on
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
#RewriteRule ^(.*)$ https://example.com$1 [R=301,L]
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

<VirtualHost *:80>
ServerName example2.com
ServerAlias www.example2.com
DocumentRoot /var/www/html/example2
RewriteEngine on
RewriteRule ^(.*)$ https://example2.com$1 [R=301,L]
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

default443.conf:

Protocols h2 h2c http/1.1

<VirtualHost *:443>
ServerName example.com
DocumentRoot /var/www/html/example
RewriteEngine on
SSLOpenSSLConfCmd ECDHParameters secp384r1
SSLOpenSSLConfCmd Curves secp384r1
SSLEngine On
SSLCertificateFile /path/to/example.crt
SSLCertificateKeyFile /path/to/example.key
Header always set Strict-Transport-Security "max-age=63072000"
</VirtualHost>

<VirtualHost *:443>
ServerName example2.com
ServerAlias www.example2.com
DocumentRoot /var/www/html/example2
RewriteEngine on
RewriteCond %{SERVER_PORT} 443
RewriteCond %{HTTP_HOST} www\.example2\.com$
RewriteRule ^(.*)$ https://example2.com$1 [R=301,L]
SSLEngine On
SSLCertificateFile /path/to/example2.crt
SSLCertificateKeyFile /path/to/example2.key
Header always set Strict-Transport-Security "max-age=63072000"
</VirtualHost>

SSLProtocol             -all +TLSv1.2
SSLCipherSuite          -all:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305
SSLHonorCipherOrder     on
SSLCompression          off
SSLSessionTickets       off

SSLUseStapling On
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"

В соответствии с вышеуказанной конфигурацией example.com правильно разрешается через https: // с использованием объявленных наборов шифров при сбое рукопожатия SSL для example2.com.

В случае комментирования нашей директивы SSLCipherSuite или замены наборов шифров на наборы , предложенные Mozilla для TLS 1.2, example2.com начинает работать через https: // также.

apachectl -v Версия сервера: Apache / 2.4.41

openssl версия OpenSSL 1.1.1 c 28 мая 2019

Я хотел бы выяснить причину, по которой только одно имя хоста работает должным образом через https: //, в то время как остальные продолжают получать сбойные рукопожатия SSL с объявленными ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305 шифрами.

1 Ответ

0 голосов
/ 28 февраля 2020

Разрешение оказалось довольно очевидным после некоторых исследований.

Был установлен сертификат ECDSA SSL / TLS для правильной работы имени хоста (example.com из списков), в то время как все остальные хосты имели сертификаты с RSA для них установлены закрытые ключи.

Поскольку заявленные наборы шифров были только для ECDSA-аутентификации ( 1 ) ( 2 ), сбой рукопожатия для хостов с закрытыми ключами RSA .

Переоформление оставшихся сертификатов с ключами E C решило проблему.

...