4

我想使用带有 Jersey 2.3 客户端的 Apache 连接器进行 HTTPS 连接。

我尝试了以下方法:

ClientConfig clientConfig = new ClientConfig();
clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, new PoolingClientConnectionManager());

ApacheConnector connector = new ApacheConnector(clientConfig);  
clientConfig.connector(connector);  

Client client = ClientBuilder.newBuilder()
    .withConfig(clientConfig)
    .sslContext(sslContext)
    .hostnameVerifier(getHostnameVerifier())
    .build();

但是,似乎 sslContext 被忽略,因为服务器的证书被拒绝为不受信任(sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径)

如果我删除“.withConfig(clientConfig)”部分,SSL 连接工作正常,但显然没有 Apache 连接器。有没有办法将我自己的 ClientConfig 与 Apache 连接器以及我自己的 SSLContext 一起使用?

4

2 回答 2

4

您需要为 apache 连接器配置 SSL。

ClientConfig clientConfig = new ClientConfig();
clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, new PoolingClientConnectionManager());
//config your ssl for apache connector
SslConfigurator sslConfig = SslConfigurator.newInstance();
clientConfig.property(ApacheClientProperties.SSL_CONFIG, sslConfig);

ApacheConnector connector = new ApacheConnector(clientConfig);  
clientConfig.connector(connector);  

Client client = ClientBuilder.newBuilder()
.withConfig(clientConfig)
.hostnameVerifier(getHostnameVerifier())
.build();
于 2013-09-28T10:08:53.827 回答
0

不知道你为什么使用 apache 连接器。但是您可以像这样使用 jersey 和 https 建立客户端连接:

ClientConfig config = new DefaultClientConfig();
SSLContext ctx = SSLContext.getInstance("SSL");
ctx.init(null, myTrustManager, null);
config.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, new HTTPSProperties(hostnameVerifier, ctx));
Client client = Client.create(config);
于 2013-09-28T00:46:20.493 回答