У меня есть несколько имен хостов, работающих на 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
шифрами.