为正确的 SNI 握手设置 Apache VirtualHost

Setting Apache VirtualHost up for proper SNI handshake

我的 Apache 机器出现问题,它与客户端预期的服务器名称不匹配,导致出现警告:

TLSv1.2 记录层:警报(级别:警告,描述:无法识别的名称)

我很确定这与我的 VirtualHost 配置有关。虽然我已经为所有主机设置了 ServerName 和 ServerAlias,但服务器没有发回服务器名称。

这是我的 Apache 配置:

<VirtualHost *:80>
    ServerName example.io
    ServerAlias example.io
    Redirect permanent / https://example.io
</VirtualHost>

<VirtualHost *:80>
    ServerName api.example.io
    ServerAlias api.example.io
    Redirect permanent / https://api.example.io
</VirtualHost>

<VirtualHost *:80>
    ServerName store.example.io
    ServerAlias store.example.io
    Redirect permanent / https://store.example.io
</VirtualHost>

<VirtualHost *:443>
    ServerName example.io
    ServerAlias example.io
    DocumentRoot /var/www/html

    SSLEngine on
    SSLCertificateFile /path/file.crt
    SSLCertificateKeyFile /path/file.key
    SSLCertificateChainFile /path/file.crt

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

如有任何帮助,我们将不胜感激!

这不是 SNI 的问题,而是缺少链证书。来自SSLLabs的报告:

Chain issues    Incomplete
...
2   Extra download  RapidSSL SHA256 CA - G3 
Fingerprint: 0e34141846e7423d37f20dc0ab06c9bbd843dc24 

桌面浏览器通常从其他站点缓存或下载这些丢失的链证书。在这种情况下,其他应用程序或移动浏览器大多会失败。

除此之外,您还有其他设置问题,例如提供弱密码 (RC4) 和协议 (SSL3.0)。

TLSv1.2 Record Layer: Alert (Level: Warning, Description: Unrecognized Name)

这可能是因为您有一个 ServerName example.io,但客户端使用的 www.example.io 与您提供的 ServerName 不匹配。您不会在客户端收到错误,因为证书与客户端使用的名称相匹配。你可能应该使用

 ServerAlias example.com *.example.com

让这个警告消失。