HTTPD新手提出的问题。因此,我们有一个Apache HTTP服务器(2.4.38)作为SSL终止代理,通过AJP将请求转发到Apache Tomcat。要求是在没有任何验证的情况下在请求标头中传递客户端证书(它们看起来很复杂,因此是在应用服务器上执行的。)
这很简单,并且类似Apache配置中的以下内容:
SSLVerifyClient optional_no_ca
SetEnvIf ^X-SSL-certificate$ .+ X_SSL_CERTIFICATE_HEADER_PRESENT
RequestHeader set X-SSL-certificate "%{SSL_CLIENT_CERT}s" env=!X_SSL_CERTIFICATE_HEADER_PRESENT
现在,我们还有一个Swagger UI网页,允许您使用REST API进行播放(即实际上正在执行来自浏览器的相同REST API请求)。但是,使用上述配置,浏览器将不断显示“选择证书”弹出窗口,我们希望避免此弹出窗口,因为他的实际证书在这里无关紧要-如果应用程序服务器上看到的是来自Swagger UI(通过分析REFERER标头,这不是很可靠的解决方案,我同意。)
我唯一能找到的解决方案就是添加
SSLCACertificateFile conf/ssl/server.crt
具有伪造的CA,没有人可以将其用作发行者证书(在这种情况下,这是Apache随附的默认证书)。 AFAIU SSLCADNRequestFile 应该在这里有所帮助,但是以某种方式它根本没有效果...因此,您仍然可以从例如邮递员,但浏览器不会显示弹出窗口,因为您没有合适的证书。
最终的问题是,如何实现正确的方法?显然,使用伪造的SSLCACertificateFile的丑陋解决方法不应该是IHMO ...
更新#1
好吧,它最终演变为以下内容:
SSLVerifyClient none
SSLOptions +ExportCertData
RequestHeader set X-SSL-certificate ""
<Location ~ "/app-url">
<If "%{HTTP_REFERER} !~ /swagger-ui\.html/">
SSLVerifyClient optional_no_ca
RequestHeader set X-SSL-certificate "%{SSL_CLIENT_CERT}e"
</If>
</Location>
仍然看起来朴实的恕我直言,但至少不是那么难看。 尽管人们说它不适用于TLS 1.3 ...