有没有办法在柑橘框架中关闭 ssl 验证?

Is there a way to turn off ssl validation in citrus framework?

我想测试 https (api) 客户端。

但我想关闭柑橘中的 ssl validation。你能告诉我如何关闭 ssl 验证吗?

(httpActionBuilder -> httpActionBuilder 
.client("https://localhost") .send() .get() .header(....) 

这是自动检查 ssl 证书。

我收到以下异常:

PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; nested exception is javax.net.ssl.SSLHandshakeException.

有没有办法关闭 ssl 验证(就像我们在 postman 或任何其他框架中禁用 ssl 验证一样)。

我如何将 ssl 上下文添加到柑橘测试中

http(httpActionBuilder -> httpActionBuilder .client("https://....com") .send() .get() .header(....)

您可以试试下面的代码。我正在尝试允许所有受信任的证书,以便您可以进行 https 调用。

try {
TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
            public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; }
            public void checkClientTrusted(X509Certificate[] certs, String authType) { }
            public void checkServerTrusted(X509Certificate[] certs, String authType) { }

        } };

SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(
                sslcontext, NoopHostnameVerifier.INSTANCE);     
HttpClients.custom()
                .setSSLSocketFactory(sslSocketFactory)
                .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
                .build();               
}
catch (IOException | CertificateException | NoSuchAlgorithmException | KeyStoreException | KeyManagementException e) {
        throw new BeanCreationException("Failed to create http client for ssl connection", e);
}

添加关注class

class NonValidatingTrustManager implements X509TrustManager {

    @Override
    public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
    }

    @Override
    public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
    }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return new X509Certificate[0];
    }
}

然后在 Spring @Configuration 中通过声明新 bean

覆盖默认的 SSLContext
@Bean
public SSLContext sslContext() throws KeyManagementException, NoSuchAlgorithmException {
    SSLContext ctx = SSLContext.getInstance("TLS"); // or try "SSL"
    ctx.init(null, new TrustManager[] { new NonValidatingTrustManager() }, null);
    return ctx;
}

更新

对于测试,您创建单独的配置 class 并将覆盖的 SSLContext 也放在那里:

@TestConfiguration
class TestConfig {

    @Bean
    public SSLContext sslContext() throws Exception {
        SSLContext ctx = SSLContext.getInstance("TLS"); // or try "SSL"
        ctx.init(null, new TrustManager[] { new NonValidatingTrustManager() }, null);
        return ctx;
    }
}

并在单元测试中使用它,例如:

@SpringBootTest(classes = { TestConfig.class })
class MyTest {
    ...
}