多个Apache托管站点出现选择性错误SSL版本或密码不匹配错误

多个Apache托管站点出现选择性错误SSL版本或密码不匹配错误,apache,ssl,openssl,tls1.2,Apache,Ssl,Openssl,Tls1.2,我有几个在Apache上运行的主机名,我想对它们进行特定的强TLS配置。Apache中启用了2个.conf文件:第一个文件包含端口80的所有虚拟主机(比如default.conf),另一个文件存储端口443的相应虚拟主机(default443.conf) 可以通过https://,仅从default.conf的第一个虚拟主机访问主机名。所有剩余的主机都在任何web浏览器中抛出错误\u SSL\u版本\u或\u密码\u不匹配。当通过curl访问失败的主机名时,出现以下错误: curl:(35)错误

我有几个在Apache上运行的主机名,我想对它们进行特定的强TLS配置。Apache中启用了2个
.conf
文件:第一个文件包含端口80的所有虚拟主机(比如
default.conf
),另一个文件存储端口443的相应虚拟主机(
default443.conf

可以通过https://,仅从
default.conf
的第一个虚拟主机访问主机名。所有剩余的主机都在任何web浏览器中抛出错误\u SSL\u版本\u或\u密码\u不匹配。当通过
curl
访问失败的主机名时,出现以下错误:

curl:(35)错误:14094410:SSL例程:ssl3_读取_字节: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>
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
指令,或者用TLS 1.2的密码套件替换密码套件,example2.com也会通过https://正常工作

apachectl-v 服务器版本:Apache/2.4.41

openssl版本 OpenSSL 1.1.1c 2019年5月28日


我想弄清楚为什么只有一个主机名通过https://正常工作,而其余的主机名通过
ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-chachacha20-POLY1305
密码一直无法进行SSL握手。

经过一些研究,解决方案似乎非常明显

为主机名安装了ECDSA SSL/TLS证书,该证书工作正常(清单中的
example.com
),而所有其他主机都安装了带有RSA私钥的证书

由于声明的密码套件仅为ECDSA身份验证(),因此对于使用RSA私钥的主机,握手失败

用EC密钥重新颁发剩余的证书解决了这个问题