0

使用 Hoverfly-java 在单元测试中模拟 Web 服务,并使用 HttpClient 作为 Web 客户端,发现 hoverfly 代理设置可以正确传播,useSystemProperties()但是我仍然有 TLS 错误:未知证书,我必须使用手动将证书添加到密钥库

wget https://raw.githubusercontent.com/SpectoLabs/hoverfly/master/core/cert.pem
sudo $JAVA_HOME/bin/keytool -import -alias hoverfly -keystore $JAVA_HOME/jre/lib/security/cacerts -file cert.pem

我需要在没有上述两个命令的情况下添加 Hoverfly SSL 上下文,我已经尝试过:

CloseableHttpClient httpClient = httpClientBuilder.useSystemProperties().setSSLContext(SomeTestClass.hoverflyRule.getSslConfigurer().getSslContext()).build();

但仍然有 TLS 错误,有什么想法吗?

我知道可以使用 java 代码运行以上两个命令,ProcessBuilder但这会带来安全问题,因为它需要 sudo 访问和不需要的漏洞(这也不起作用)。

4

1 回答 1

1

联系Hoverfly 支持后,我的工作如下

CloseableHttpClient httpClient = HttpClients.custom()
            //.setConnectionManager(poolingConnectionManager) //this causes TLS errors so I commented it out until this final issue is solved.
            .setRetryHandler(new DefaultHttpRequestRetryHandler(2, true))
            .setKeepAliveStrategy(new DefaultConnectionKeepAliveStrategy())
            .setDefaultRequestConfig(requestConfig)
            .setDefaultCredentialsProvider(credsProvider)
            .setDefaultHeaders(headers)
            .useSystemProperties()
            .build();

我在使用时仍然有问题setConnectionManager()(它再次导致 TLS 错误),这些是我需要为新创建的添加的设置HttpCleint

PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager(30, TimeUnit.SECONDS);
poolingConnectionManager.setMaxTotal(1000);
poolingConnectionManager.setDefaultMaxPerRoute(1000);

更新

已解决的问题,在搜索和联系 hoverfly 支持后我发现了类似的问题,我解决了它使用

private PoolingHttpClientConnectionManager getPoolingHttpClientConnectionManager() {
    SSLConnectionSocketFactory sslsocketFactory = null;
    try {
        sslsocketFactory = new SSLConnectionSocketFactory(SSLContext.getDefault(), new DefaultHostnameVerifier());
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }

    Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
                                                                .register("https", sslsocketFactory)
                                                                .register("http", PlainConnectionSocketFactory.INSTANCE)
                                                                .build();

    PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); 
    poolingConnectionManager.setMaxTotal(1000);
    poolingConnectionManager.setDefaultMaxPerRoute(1000);
    // Used these settings instead of constructor parameters (long timeToLive, TimeUnit timeUnit)
    poolingConnectionManager.closeIdleConnections(30, TimeUnit.SECONDS);

    return poolingConnectionManager;
}

我希望 Hoverfly 可以代替所有这些麻烦。

于 2019-11-27T09:38:41.370 回答