如何为某个 URL 禁用相互认证

How to disable Mutual Authentication for a certain URL

我正在做一个项目,我们使用以下配置配置了当前的 Jetty 服务器:

        SslContextFactory sslContextFactory = new SslContextFactory();

        sslContextFactory.setKeyStorePath(tlsCfg.tlsKeystoreLocation);
        sslContextFactory.setKeyStorePassword(tlsCfg.tlsKeystorePassword);
        sslContextFactory.setNeedClientAuth(tlsCfg.useMutualAuth);
        sslContextFactory.setIncludeProtocols("TLSv1.2", "TLSv1.3");
        // cipher suites that are not secure are properly removed by default constructor.
        if (tlsCfg.useMutualAuth) {
            sslContextFactory.setTrustStorePath(tlsCfg.tlsTruststoreLocation);
            sslContextFactory.setTrustStorePassword(tlsCfg.tlsTruststorePassword);
        }

        JettyHttpContainerFactory.createServer(getSecureBaseURI(port), sslContextFactory, rc);

我们的应用程序具有如下所示的状态资源:

    @Path("status")
    public class StatusResource {


        @Autowired(required = false) // optional dependencies are not supported by @Inject
        public StatusResource(Supplier<List<Status>> subStatusesSupplier) {
            this.subStatusesSupplier = subStatusesSupplier;
        }

        @GET
        @Produces(MediaType.APPLICATION_JSON)
        public Status status() {
            ...
            return status;
        }
    }

如果此端点(且仅此端点)不需要 MutalAuthentication 和 Tls 设置,那么对于我们的运营团队将非常有帮助。

是否有从整个 SslContextFactory 中排除一个端点的选项?

不可能。

TLS/SSL 发生在请求发出之前。

该请求包含您要限制相互身份验证的端点的 URI。

实现此目的的唯一方法是使用 2 个 ServerConnector,每个都有自己的 SslContextFactory,一个具有相互身份验证,一个没有。