【问题标题】:Trusting Hoverfly java certificate programmatically以编程方式信任 Hoverfly java 证书
【发布时间】:2020-03-20 16:52:20
【问题描述】:

在单元测试中使用 Hoverfly-java 模拟 web 服务,并使用 HttpClient 作为 web 客户端,发现使用 useSystemProperties() 可以正确传播 hoverfly 代理设置但是我仍然有 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 错误,有什么想法吗?

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

【问题讨论】:

    标签: java ssl mocking keystore hoverfly


    【解决方案1】:

    联系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 可以代替所有这些麻烦。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-28
      • 2015-04-11
      • 1970-01-01
      • 2011-05-17
      • 2011-05-05
      • 1970-01-01
      • 2010-10-13
      • 2011-12-11
      相关资源
      最近更新 更多