以编程方式信任 Hoverfly java 证书
Trusting Hoverfly java certificate programmatically
使用 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 context 而不是上面两个命令,我试过:
CloseableHttpClient httpClient = httpClientBuilder.useSystemProperties().setSSLContext(SomeTestClass.hoverflyRule.getSslConfigurer().getSslContext()).build();
但仍然有 TLS 错误,有什么想法吗?
我知道可以使用 ProcessBuilder
从 java 代码中 运行 以上两个命令,但这会带来安全问题,因为它需要 sudo 访问权限和不需要的漏洞(没有'也不能工作)。
联系Hoverfly support后,我的工作如下
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 支持后我发现 similar problem,我使用
解决了它
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 可以代替所有这些麻烦。
使用 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 context 而不是上面两个命令,我试过:
CloseableHttpClient httpClient = httpClientBuilder.useSystemProperties().setSSLContext(SomeTestClass.hoverflyRule.getSslConfigurer().getSslContext()).build();
但仍然有 TLS 错误,有什么想法吗?
我知道可以使用 ProcessBuilder
从 java 代码中 运行 以上两个命令,但这会带来安全问题,因为它需要 sudo 访问权限和不需要的漏洞(没有'也不能工作)。
联系Hoverfly support后,我的工作如下
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 支持后我发现 similar problem,我使用
解决了它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 可以代替所有这些麻烦。