首页 > TroubleShooting > Why can’t I use SSL with name-based/non-IP-based virtual hosts?

Why can’t I use SSL with name-based/non-IP-based virtual hosts?

2010年2月12日 发表评论 阅读评论

以前用mod_ssl+apache配ssl服务器碰到过这个问题
别人直接用ip:443端口直接访问
就显示了缺省的https的站点
按照我们配http服务器的逻辑
肯定是想把443端口和某一个域名绑定起来用的
这样别人不知道域名就无法访问到真正的https站点内容
但是直接在apache里用

这样搞是不行的
系统总是只认第一个虚机
然后把所有https到443端口的访问都丢到里面
看了下(apache)官方的文档
里面是这样解释的:

Why can’t I use SSL with name-based/non-IP-based virtual hosts?
The reason is very technical, and a somewhat “chicken and egg” problem. The SSL protocol layer stays below the HTTP protocol layer and encapsulates HTTP. When an SSL connection (HTTPS) is established Apache/mod_ssl has to negotiate the SSL protocol parameters with the client. For this, mod_ssl has to consult the configuration of the virtual server (for instance it has to look for the cipher suite, the server certificate, etc.). But in order to go to the correct virtual server Apache has to know the Host HTTP header field. To do this, the HTTP request header has to be read. This cannot be done before the SSL handshake is finished, but the information is needed in order to complete the SSL handshake phase. Bingo!

金步国同学翻译如下:
为什么不能在基于域名的虚拟主机上使用SSL?
原因很技术化,有点类似于”鸡和蛋”的问题。SSL协议层位于HTTP协议层之下,HTTP协议是被封装在SSL协议中的,当一个SSL连接(HTTPS)请求到来的时候,Apache/mod_ssl必须和客户端协商SSL协议参数(握手),所以,mod_ssl必须查看虚拟主机的配置信息(例如允许使用哪些加密算法、服务器证书是哪个等等),然后才能完成SSL会话通道的建立;但另一方面,为了确切知道究竟应该查看哪个虚拟主机,Apache又必须知道HTTP请求头的Host字段的内容,而这在完成SSL握手之前是不可能知道的。

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.