我遇到了一个非常奇怪的问题。在我们的服务器上,我们运行的是 Solaris 10,带有 httpd 2.2.19 和 openssl 1.0.0d。我们只有一个虚拟主机:
<VirtualHost _default_:443> ServerName hostname.example.com:443
当然,主机名是正确的主机名。当我们使用主机名导航到站点时,连接失败,我在 error_log 中看到 SSL 握手已启动,显示 BIO 转储,然后显示:
[调试] ssl_engine_kernel.c(1884): OpenSSL:> 写入:SSLv3 读取客户端 hello C
[调试] ssl_engine_kernel.c(1903): OpenSSL: 退出:错误中出现错误
[调试] ssl_engine_kernel.c(1903): OpenSSL: 退出:错误中出现错误
[信息] [客户端 1x.xxx] 握手中出现 SSL 库错误 1 (服务器 hostname.example.com:443)
[信息] SSL 库错误:336204149 错误:140A1175:SSL 例程:SSL_BYTES_TO_CIPHER_LIST:不适当的回退
[信息] [客户端 xxxx] 与子 0 的连接已关闭,且中止关闭(服务器 hostname.example.com:443)
[通知] 子进程 pid 28997 退出信号分段错误 (11),/usr/local/apache2/logs 中可能出现核心转储
有人知道问题可能是什么吗?我无论如何也想不出为什么主机名的处理方式与 IP 不同。我们在配置中禁用了 SSL3 协议,并启用了一长串可在其他服务器上使用的密码。
答案1
ServerName 中不应包含端口号。
另外,您是否使用基于名称的虚拟主机?如果是,请不要使用默认但请改用 *。
所以不要这样:
<VirtualHost _default_:443>
ServerName hostname.example.com:443
</VirtualHost>
拥有这个:
NameVirtualHost *:443
<VirtualHost *:443>
ServerName hostname.example.com
</VirtualHost>
根据文档http://httpd.apache.org/docs/2.2/vhosts/examples.html#default:
默认虚拟主机永远不会处理发送到用于基于名称的虚拟主机的地址/端口的请求。如果请求包含未知或没有 Host: 标头,则始终从基于名称的主要虚拟主机(配置文件中首先出现的该地址/端口的虚拟主机)处理该请求。
答案2
所以我找到了修复它的方法,但我不确定为什么这能解决这个问题。我将 ServerName 从 hostname.subdomain.domain:443 更改为 hostname.domain:443。服务器的正确名称是 hostname.subdomain.domain,但我在 hosts 文件中注意到该服务器的 IP 具有:
*IP* hostname hostname.domain
这可能是原因吗?为什么 SSL 会因此变得一团糟?