Apache httpd反向代理将SSL委托给后端

通常使用Apache作为反向代理完成SSL卸载,所以Apache处理所有SSL的东西,后端服务器只是pipe理普通的http。 但是有可能做相反的事情吗? 我不是在说Apache和后端通过https进行通信的SSLProxy。 我希望我的后端与客户端协商SSL。


有点为什么我需要这样的:
我正在使用客户端证书身份validation,当身份validation失败时,用户可以获得浏览器特定的非用户友好错误页面。 所以我们正在创build一个诊断页面,向用户显示authentication失败的原因。 这个页面应该允许任何证书,所以我们可以检查我们的自我,找出错误。
起初,我们尝试了Apache上的optional_no_ca设置,但它仍然会执行一些检查,例如到期date。 我们能够使它与Tomcat一起工作(在Java中使用它也很方便)。

现在唯一可行的解​​决scheme似乎设置了第二台服务器(物理)与tomcat作为前面。 但是,渲染一个页面似乎很重。

你不能确切地通过它。 但是,如果您愿意更改后端,则可以使用一些黑客技巧。 客户端证书作为TLS协商的一部分呈现,根据定义不能通过。

例如,您可以通过使用诸如RequestHeader set SSL_CLIENT_S_DN "%{SSL_CLIENT_S_DN}s"指令来parsing证书并传播(经过身份validation的)证书的详细信息。 看这里的例子 。

当然,要使用它进行身份validation,您需要限制对后端的访问,并在代理和后端之间使用TLS。

Apache不能这样做。 如果你想要一个中间代理,但是没有TLS操作,你的代理本质上是一个TCP隧道。

后来,当我想做类似的事情时,我偶然发现了sniproxy 。 在我看来,它可以做你想做的事情。 如果你的站点的其他部分需要Apache,你可以在sniproxy后面运行Apache。 请记住,由于SSL / TLS中的SNI工作方式,您不能在同一个主机名上运行多个后端。 在Apache上使用www.example.com,在客户端证书上使用app.example.com。 如果您只有一个IP地址可用,这是我build议的解决scheme。

另一种方法是简单地运行TCP代理,例如使用HAproxy,或者直接在专用的IP地址上直接运行应用程序。 但是,在这种情况下,您将失去在同一IP地址上运行多个站点的可能性。 (不可能有鬼)。 如果您有多个IP地址可用,这是我build议的解决scheme。

如果我能很好地理解你的整个问题,我可以看到另一个与代理无关的解决scheme:

默认情况下,客户端登陆到诊断页面(不需要证书),这使得后台AJAX查询到保护区域。 根据查询结果,JavaScriptredirect到受保护的页面或显示一条消息,解释证书有问题。