![Apache httpd 反向代理将 SSL 委托给后端](https://linux22.com/image/665678/Apache%20httpd%20%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E5%B0%86%20SSL%20%E5%A7%94%E6%89%98%E7%BB%99%E5%90%8E%E7%AB%AF.png)
通常使用 Apache 作为反向代理是为了进行 SSL 卸载,因此 Apache 处理所有 SSL 内容,而后端服务器只管理纯 http。但是否可以做相反的事情?我说的不是 SSLProxy,Apache 和后端通过 https 进行通信。我希望我的后端与客户端协商 SSL。
我需要这个的原因:
我正在使用客户端证书身份验证,当身份验证失败时,用户会得到一个特定于浏览器的非用户友好的错误页面。所以我们正在创建一个诊断页面来向用户显示身份验证失败的原因。此页面应该允许任何证书进入,以便我们可以自己检查并找出问题所在。
起初我们optional_no_ca
在 Apache 上尝试了设置,但它仍然会进行一些检查,例如到期日期。我们能够让它与 Tomcat 一起工作(使用 Java 也很方便)。
目前唯一可行的解决方案似乎是设置第二台服务器(物理),以 tomcat 作为前端。但仅渲染一个页面似乎就很繁重。
答案1
您无法完全通过它。但是,如果您愿意更改后端,可以使用一些技巧。客户端证书作为 TLS 协商的一部分提供,根据定义,它无法通过。
例如,您可以让 Apache 解析证书并通过使用类似指令传播(已经验证的)证书的详细信息RequestHeader set SSL_CLIENT_S_DN "%{SSL_CLIENT_S_DN}s"
。 请参阅此处的示例。
当然,要使用它进行身份验证,您需要限制对后端的访问并在代理和后端之间使用 TLS。
答案2
Apache 无法做到这一点。如果您希望中间有一个代理,但没有来自它的 TLS 操作,那么您的代理本质上就是一个 TCP 隧道。
不久前,当我想做类似的事情时,我遇到了sniproxy。在我看来,它可以满足您的要求。如果您需要 Apache 来处理站点的其他部分,您可以在 sniproxy 后面运行 Apache。请记住,由于 SSL/TLS 中的 SNI 的工作方式,您无法在同一主机名上运行多个后端。在 Apache 上使用类似 www.example.com 的内容,在客户端证书应用程序上使用 app.example.com 的内容。 如果您只有一个可用的 IP 地址,这是我推荐的解决方案。
另一种选择是简单地运行 TCP 代理,例如使用 HAproxy,或者简单地直接在专用 IP 地址上运行应用程序。但是,在这种情况下,您无法在同一 IP 地址上运行多个站点。(虚拟主机则无法实现)。 如果您有多个可用的 IP 地址,这是我推荐的解决方案。
答案3
如果我很好地理解了你的整个问题,我可以看到另一个与代理无关的解决方案:
默认情况下,客户端会进入诊断页面(无需证书),该页面会向受保护区域发出后台 AJAX 查询。根据查询结果,JavaScript 会重定向到受保护页面或显示一条消息,说明证书存在问题。
答案4
https的本质是保证客户端和服务器在网络层之上互相可见,因此apache无法在后端将http代理到https。
除了我在其他答案中看到的 sniproxy 之外,我建议哈普罗西。它是一个具有许多功能的快速 TCP 代理。