我正在构建Web服务,并且正在使用Jetty作为服务器。对于此服务提供的某些API,我们希望它们通过证书进行身份验证。所以我有以下代码:
SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setWantClientAuth(true);
Server server = new Server(pool);
ServerConnector sslConnector = new ServerConnector(server,
new SslConnectionFactory(sslContextFactory, "HTTP/1.1"),
new HttpConnectionFactory(httpsConfig));
server.addConnector(sslConnector);
现在,我的服务还具有相应的Web UI。当用户访问依次调用后端API的Web UI时,浏览器会提示用户输入证书。我不希望发生这种情况,因为Web UI调用的API不支持证书身份验证。但是,以上代码是以全局方式配置的。有什么办法解决这个问题?
更新:
我研究了其他服务器实现。 例如,在ASP.NET中,我们可以定义以下配置:
<location path="some-api">
<system.webServer>
<security>
<access sslFlags="SslNegotiateCert"/>
</security>
</system.webServer>
</location>
Apache Http Server中也有similar settings
因此,似乎SSL / TLS本身并没有禁止我这样做。我错过了任何Jetty设置吗?
答案 0 :(得分:2)
TLS级别证书验证在HTTP请求甚至被发送/处理/解析之前进行。
基于TLS握手后的信息,无法跳过该验证。
作为一种替代方法,您可以将证书验证仅放在同一台计算机(具有不同的ServerConnector配置)的不同端口上,而使普通连接器不进行客户端证书验证。