虚拟主机/服务器在 SSL 证书上存在一些冲突,并且仅在 Chrome 浏览器上产生错误“ERR_SSL_PROTOCOL_ERROR”。我在 Apache2 和 Nginx 上尝试了很多配置
我有 1 个服务器 (ipv4) 和 2 个子域名 (vhost) 指向该服务器(domain1.dns.fr 和 domain2.dns.fr)
几周前,Google Chrome 仅在一个子域 (domain2.dns.fr) 上返回 SSL 错误“ERR_SSL_PROTOCOL_ERROR”。
此错误仅在 Google Chrome 上出现(Firefox、Edge 已测试成功)。
我尝试使用 Apache 和 Nginx 更改 Vhost 配置,但我遇到了相同的错误。
非常奇怪的情况是:如果我的虚拟主机声明顺序相反,则domain2.dns.fr可以工作,但domain1.dns.fr停止工作(同样的错误:ERR_SSL_PROTOCOL_ERROR)。请参阅下面此用例的给定配置。
所以,我不确定问题来自 Frontal 应用程序。 (这不是浏览器缓存问题;-))但我没有发现问题。
技术栈:
使用 APACHE 测试 - 配置
<VirtualHost domain1.dns.fr:443>
ServerName domain1.dns.fr
ProxyPass / http://localhost:8080/
SSLEngine on
SSLProtocol -all +TLSv1.2
SSLCertificateFile /root/.acme.sh/domain1.dns.fr/domain1.dns.fr.cer
SSLCertificateChainFile /root/.acme.sh/domain1.dns.fr/ca.cer
SSLCertificateKeyFile /root/.acme.sh/domain1.dns.fr/domain1.dns.fr.key
</VirtualHost>
<VirtualHost domain2.dns.fr:443>
ServerName domain2.dns.fr
DocumentRoot /var/www/domain2.dns.fr/public
<Directory /var/www/domain2.dns.fr/public>
Require all granted
Options -Indexes +FollowSymLinks
AllowOverride all
</Directory>
SSLEngine on
SSLCertificateFile /root/.acme.sh/domain2.dns.fr/domain2.dns.fr.cer
SSLCertificateChainFile /root/.acme.sh/domain2.dns.fr/ca.cer
SSLCertificateKeyFile /root/.acme.sh/domain2.dns.frdomain2.dns.fr.key
</VirtualHost>
server {
listen *:443 ssl;
server_name domain1.dns.fr;
charset utf-8;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-for $remote_addr;
port_in_redirect off;
proxy_redirect off;
}
ssl on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_session_cache shared:SSL:20m;
ssl_session_timeout 60m;
ssl_prefer_server_ciphers on;
ssl_certificate /root/.acme.sh/domain1.dns.fr/domain1.dns.fr.cer;
ssl_certificate_key /root/.acme.sh/domain1.dns.fr/domain1.dns.fr.key;
}
server {
listen *:443 ssl http2;
server_name domain2.dns.fr;
charset utf-8;
location / {
# redirect on apache instance reconfigured on port 7000 for test without php-fpm installation
proxy_pass http://localhost:7000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-for $remote_addr;
port_in_redirect off;
proxy_redirect off;
}
ssl on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_session_cache shared:SSL:20m;
ssl_session_timeout 60m;
ssl_prefer_server_ciphers on;
ssl_certificate /root/.acme.sh/domain2.dns.fr/domain2.dns.fr.cer;
ssl_certificate_key /root/.acme.sh/domain2.dns.fr/domain2.dns.fr.key;
}
127.0.0.1 localhost
151.80.129.173 vpsXXXXX.ovh.net vpsXXXXX
domain1.dns.fr -> TLS 0 -> A -> XXX.XXX.XX.XX
domain2.dns.fr -> TLS 0 -> A -> XXX.XXX.XX.XX
注意:如果我尝试减少对 ServerName 绑定的限制,则当客户端查询 domain2.dns.fr 时,domain1.dns.fr 的 SSL 证书会在浏览器中返回(...)。 vhost 看起来很困惑..
您有什么想法/解决方案需要帮助吗?
不确定这是否是您的情况... 但几天前我也遇到了类似的麻烦。 我在 Centos 的 Nginx/Apache/Openssl 环境中很少有网站。 Nginx 是 1.4.4,Openssl 是 1.0.1e。是的,很老的了。 显然,由于某些 SSL 证书问题,除了位于 Nginx conf 文件中第一个的网站外,所有网站都停止在 Android 的 Chrome 中显示。错误就像你的一样,“ERR_SSL_PROTOCOL_ERROR”。 iOS/Windows Chrome 没问题。 iOS/Android/Windows 上的所有其他浏览器也都正常。 通过调查,我发现我的任何一个位于 Nginx conf 文件中第一个的网站都开始在 Android 的 Chrome 中运行,但只有第一个。 由于问题很奇怪,并且只出现在一种操作系统的一种浏览器中,所以最后我除了尝试升级一些东西之外没有更好的主意。 首先我将 Nginx 升级到最新的稳定版,我相信是 1.24。这没有任何意义,麻烦就在那里。 之后我将 Openssl 升级到 1.0.1 分支的最新版本,1.0.1u IIRC。 这终于让我高兴了,一切又开始顺利进行了。 感谢您的长读。