我正在将网站从一台服务器移至另一台服务器,并使用其当前且仍然有效的 SSL 证书。我正在使用的机器是 Ubuntu 14.04 服务器。我已经设置了我常用的虚拟主机文件,我们将其称为 my_domain.conf。以下是其内容:
#省略 VirtualHost 附近的主要/次要标志 虚拟主机 *:443 服务器管理员[电子邮件保护] 服务器名称 mydomain.com 服务器别名 www.mydomain.com SSLEngine 开启 SSL证书文件 /etc/ssl/certs/mydomain.com.crt SSLCertificateKeyFile /etc/ssl/private/mydomain.com.key DocumentRoot /var/www/html/mydomain.com/public 错误日志 /var/log/apache2/mydomain-error.log 传输日志 /var/log/apache2/mydomain-access.log /虚拟主机
现在,当我在浏览器上输入 www.mydomain.com 时,VirtualHost 可以工作。但是当我输入 mydomain.com 时,它却不行。客户和网页设计师都需要它,所以我无法避免它。
我试过了
- 交换 ServerName 和 ServerAlias,并仅使用 ServerName
- 禁用所有其他虚拟主机,包括默认虚拟主机
- 在我的常规(非特定于站点的)error.log 中注意到此行后,添加 SSLStrictSNIVHostCheck 开启和关闭:
[ssl:warn] [pid 6558] AH02292: Init: Name-based SSL virtual hosts only work for clients with TLS server name indication support (RFC 4366)
什么都没改变,我真的不明白为什么会发生这种情况
编辑:我忘了补充,“它不起作用”的意思是虚拟主机配置文件被绕过,浏览器将我带到 apache2 默认文档根目录
答案1
我也是。我放弃尝试在 SSL 主机上创建 ServerAlias。我的解决方案:
VirtualHost *:443
ServerAdmin [email protected]
ServerName mydomain.com
...
/VirtualHost
VirtualHost *:443
ServerAdmin [email protected]
ServerName www.mydomain.com
...//same as above
/VirtualHost
我知道它很丑,但是它能起作用——不会让人头疼。
答案2
“基于名称的 SSL 虚拟主机仅适用于具有 TLS 服务器名称指示支持的客户端”消息指的是 Web 客户端(即您的浏览器)缺乏 SNI 支持。换句话说,此消息通常不表示您的服务器设置存在问题,而只是警告某些浏览器将无法访问服务器。为清楚起见,这只是一条“信息”消息,并不表示出现任何问题。
值得注意的是,许多旧版浏览器不支持 SNI,因此无法在多域证书中协商主题备用名称 (SAN)。如需查看浏览器列表或了解更多信息,您可以在网上搜索“SNI 支持”,但实际上,您必须有非常充分的理由才能放弃使用多域证书,以便与旧版浏览器兼容。
你可能需要提高你的LogLevel
获取更详细的信息,然后其他人才能帮助您找到问题。
答案3
我遇到了非常类似的问题,并使用调试日志级别解决了该问题。我没有禁用默认虚拟主机定义 (ssl.conf)。那里没有 DocumentRoot 或 ServerName 或 Alias,但由于某种原因,此配置与我的 vhost 冲突。因此,要解决此问题,只需注释掉整个默认虚拟主机部分:
#<VirtualHost _defaulr_:443>
#...
#</VirtualHost>
将证书详细信息复制到 vhost 或其外部(供全局使用)并重新启动 apache。这对我有帮助。
答案4
仅尝试使用 ServerAlias 例如:
ServerAdmin [email protected]
ServerAlias example.com
ServerAlias www.example.com
DocumentRoot /var/www/html/
我目前正在使用它并且我的网站运行良好。