【问题标题】:How to configure Jersey (javax.ws.rs.*) to reuse ssl sessions如何配置 Jersey (javax.ws.rs.*) 以重用 ssl 会话
【发布时间】:2015-03-16 05:38:53
【问题描述】:

我编写了一个测试客户端,它使用 Jersey 库通过 TLS 发送请求。我很难弄清楚如何配置/编码 Jersey 客户端,以便它重用 SSL 会话,以便我可以更快地进行测试。 Jersey 客户端默认使用 HTTP keepAlive;这意味着它保持 TCP 连接打开并重用它们,但它似乎对 SSL 会话没有做同样的事情。

如果有人有这方面的经验,请告诉我。

这是我用来设置 Jersey 客户端的代码 sn-p 以及我用来发送请求的代码:

        SSLContext sslContext = sslConfig.createSSLContext().getInstance(tlsVersion);
        sslContext.init(keyManagerFactory.getKeyManagers(), trustAllCerts, new SecureRandom());
        SSLEngine sslEngine = sslContext.createSSLEngine("qa.p.uvvu.com", 7001);

        Client client =  ClientBuilder.newBuilder().sslContext(sslContext)
                .hostnameVerifier(new HostnameVerifier() {
                    @Override
                    public boolean verify(String hostname, SSLSession session) {
                        return true;
                    }
                }).build();


    response = client.target(uri).request()
            .headers(multivaluedMap).post(Entity.entity(object, MediaType.APPLICATION_XML_TYPE));

【问题讨论】:

  • TLS 会话重用是 JSSE 级别的默认设置,实际上我不知道有什么方法可以关闭它。是什么让你认为它没有发生?如果不是,是什么让你认为是客户端负责?我会好好看看 server 配置。
  • 感谢 EJP 抽出时间回复。我确信服务器端的设置是正确的,并且在我为每个请求更改测试期间正在查看服务器端的 sessionID。所以,是肯定的。最后,更改为 GrizzlyConnectorProvider 解决了这个问题,现在我的测试速度快了近三倍!谢谢!
  • 但是当您为客户端使用浏览器时会发生这种情况吗?
  • @Naren Nala 你能提供你的解决方案吗?我也在尝试同样的方法,但找不到解决方案

标签: java ssl jax-rs jersey-2.0 keep-alive


【解决方案1】:

我为此使用 Apache 连接器:

HttpClientConnectionManager connManager = PoolingHttpClientConnectionManager();

ClientConfig clientConfig = new ClientConfig();
clientConfig.connectorProvider(new ApacheConnectorProvider());
clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, connManager);

Client client = ClientBuilder.newClient(clientConfig);

您可以根据需要配置HttpClientConnectionManager,具体取决于您希望在池中保留多少连接,以及您希望将它们保留在池中多长时间。

免责声明:我没有代码,所以上面的代码可能无法 100% 工作。

【讨论】:

  • 与 TLS 会话无关。
  • 感谢奥古斯托!我尝试按照您的建议使用 ApacheConnectorProvider,但由于我使用的是自签名证书,它似乎会抛出异常。但是,我进行了一些研究并使用了 GrizzlyConnectorProvider 并解决了这个问题。再次感谢帮我解决这个问题。
  • @NarenNala 那么这在什么方面是正确的答案?
  • 通过重用与连接池的连接,您不需要在每次调用时重新建立 TLS 会话,因为连接保持打开状态(Apache http 客户端确保这一点)。所以你最终避免了昂贵的 TLS 握手。 @EJP,你听起来好像知道这些东西,你能解释一下你的其他解决方案吗?
  • @Augusto 还有什么解决办法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 2019-03-21
  • 1970-01-01
相关资源
最近更新 更多