了解ssl设置

目标:

  • 如果用户支持SNI并点击myurl1.server.com(https)或myurl2.server.com(https),则会匹配正确的虚拟主机。 (最后2个虚拟主机)
  • 如果用户不支持SNI并击中myurl1.server.com(https)或myurl2.server.com(https),它将被回退虚拟主机(第一个端口443)捕获。 它包含SAN证书,它会再次击中服务器以进行匹配。 这一次它会打到最后2个虚拟主机。
  • 如果用户使用http或者httpsinput一个未知的URL,它将被捕获到显示错误页面的第一个虚拟主机中。

我testing了所有3个目标,它工作正常。

问题:

  • 当用户正在点击SAN虚拟主机(https)向其发出新的请求时。 当SAN vhost中的proxypass使用http(80)时,Apache如何知道它将匹配最后2个虚拟主机(443)
  • 当用户点击SAN vhost时,我看不到SAN访问日志中的任何请求。 这些请求只会出现在最后2个虚拟主机中,即使它通过SAN虚拟主机。 不过,我可以在SAN访问日志中看到一些bot请求。

代码只包含重要的部分。

NameVirtualHost *:80 NameVirtualHost *:443 <VirtualHost *:80> show error page </VirtualHost> <VirtualHost *:443> SSLCertificateFile san.crt CustomLog san-access.log ProxyPass / http://my-local-url-server/ ProxyPassReverse / http://my-local-url-server/ </VirtualHost> <VirtualHost *:443> ServerName myurl1.server.com SSLCertificateFile myurl1.crt CustomLog myurl1-access.log ProxyPass / http://mybackend1/ ProxyPassReverse / http://mybackend1/ </VirtualHost> <VirtualHost *:443> ServerName myurl2.server.com SSLCertificateFile myurl2.crt CustomLog myurl2-access.log ProxyPass / http://mybackend2/ ProxyPassReverse / http://mybackend2/ </VirtualHost> 

这里的困惑是在SSL协商和Apache虚拟主机处理之间。 这是发生了什么事情:

如果用户在不支持SNI的情况下连接,Apache不能首先知道用户想要哪个虚拟主机,因为主机名隐藏在SSLencryption中。 所以apache将使用它为SSL协商find的第一个SSL证书。 一旦客户端已经接受了这个证书并且完成了协商,那么Apache将能够解密请求并且处理它,就好像客户端从一开始就被支持了SNI一样。

所以从来没有任何HTTP请求到SAN服务器 – 只有一个SSL协商,它使用来自SAN服务器的证书,然后找出哪个虚拟主机用于HTTP请求。 Apache只loggingHTTP请求,而不是SSL协商。