了解 SSL 设置

了解 SSL 设置

目标:

  • 如果用户支持 SNI 并点击 myurl1.server.com (https) 或 myurl2.server.com (https),​​它将匹配正确的虚拟主机。(最后 2 个虚拟主机)
  • 如果用户不支持 SNI 并访问 myurl1.server.com (https) 或 myurl2.server.com (https),​​它将被 fallback vhost(端口 443 上的第一个)捕获。它包含 SAN 证书,它将再次访问服务器进行匹配。这次它将访问最后 2 个 vhost。
  • 如果用户输入未知的 http 或 https 网址,它将被捕获到第一个显示错误页面的 vhost 中。

我已经测试了所有 3 个目标并且运行良好。

问题:

  • 当用户访问 SAN vhost (https) 时,它会向自身发出新请求。当 SAN vhost 中的代理密码使用 http(80) 时,Apache 如何知道它将匹配最后 2 个 vhost (443)
  • 当用户访问 SAN vhost 时,我在 SAN 访问日志中看不到任何请求。即使经过 SAN vhost,请求也只出现在最后 2 个 vhost 中。但是我可以在 SAN 访问日志中看到一些机器人请求。

代码仅包含重要部分。

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>

答案1

这里的混淆在于 SSL 协商和 apache vhost 处理之间。以下是发生的情况:

如果用户在不支持 SNI 的情况下进行连接,Apache 一开始无法知道用户想要哪个虚拟主机,因为主机名隐藏在 SSL 加密中。因此 apache 将使用它找到的第一个 SSL 证书进行 SSL 协商。一旦客户端接受了该证书并完成协商,Apache 将能够解密请求并处理它,就像客户端从一开始就支持 SNI 一样。

因此,永远不会有任何 HTTP 请求发送到 SAN 服务器 - 只有一个 SSL 协商,该协商使用来自 SAN 服务器的证书,然后再确定要使用哪个 vhost 来处理 HTTP 请求。Apache 仅记录 HTTP 请求,而不记录 SSL 协商。

相关内容