在Jetty中,如何仅在一部分API上支持证书身份验证

时间:2019-03-01 06:21:34

标签: ssl jetty client-certificates

我正在构建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设置吗?

1 个答案:

答案 0 :(得分:2)

TLS级别证书验证在HTTP请求甚至被发送/处理/解析之前进行。

基于TLS握手后的信息,无法跳过该验证。

作为一种替代方法,您可以将证书验证仅放在同一台计算机(具有不同的ServerConnector配置)的不同端口上,而使普通连接器不进行客户端证书验证。