从 0.9.6 升级到 1 后,PKIX 路径构建失败。0.x 空手道版本

PKIX Path Building failed after upgrading from 0.9.6 to 1.0.x karate version

我试图将我们的工作空手道测试从 0.9.6 空手道版本升级到 1.0.x 版本。我已经使用 ssl 配置在功能文件中定义了密钥库和信任库,它们在空手道的 0.9.6 版本中工作正常。当我更改为使用空手道的 1.0.x 版本时,我收到 PKIX 路径构建失败消息:

javax.net.ssl|ERROR|1B|pool-1-thread-1|2021-05-22 17:18:20.212 CDT|TransportContext.java:318|Fatal (CERTIFICATE_UNKNOWN): PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target ( "throwable" : {
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

我在 karate ApacheHttpClient class 中添加了断点,我可以看到正在设置 Keystore 和 TrustStores,并且在 [=43] 时验证可信证书是否被添加为可信证书=] -Djavax.net.debug=全部.

我什至添加了发送到信任库的特定服务器证书。我似乎无法找到我在空手道 1.0.x 版本上收到 PKIX 故障的根本原因,但完全相同的配置在 0.9.6 版本中工作正常。我还验证了正在发送的服务器证书的完整链中的 CA 是否包含在我的信任库中。发送请求后,似乎我的信任库可能被忽略了。

关于空手道 1.0.x 中 TLS 连接可能有何不同的想法?据我从文档中得知,ssl 配置选项没有改变。


转载空手道演示:https://github.com/intuit/karate/tree/v1.0.1/karate-demo/src/test/java/ssl

我对空手道演示 SSL 测试做了一些调整,以显示场景大纲和 connectTimeout 或 readTimeout 设置的问题:

空手道-config.js:

function fn() {
  karate.configure('connectTimeout', 5000);
  karate.configure('readTimeout', 5000);
  var port = karate.properties['demo.server.port'] || '8080';
  var protocol = 'http';
  if (karate.properties['demo.server.https'] === 'true') {
    protocol = 'https';
    karate.configure('ssl', true);
  }
  var config = { demoBaseUrl: protocol + '://127.0.0.1:' + port };
  if (karate.env !== 'mock') {
    // karate.configure('callSingleCache', { minutes: 1 });
    // 'callSingle' is guaranteed to run only once even across all threads
    var result = karate.callSingle('classpath:demo/headers/common-noheaders.feature', config);
    // and it sets a variable called 'authInfo' used in headers-single.feature
    config.authInfo = { authTime: result.time, authToken: result.token };
  }
  config.applicationPaths = JSON.parse('[{"contextPath":"test"},{"contextPath":"test"}]')
  return config;
} 

ssl-keystore.feature:

Feature: jersey ssl with trust store / cert

Background:
    * configure ssl = { keyStore: 'classpath:server-keystore.p12', keyStorePassword: 'karate-mock', keyStoreType: 'pkcs12', trustStore: 'classpath:server-keystore.p12', trustStorePassword: 'karate-mock', trustStoreType: 'pkcs12' }
    * url 'https://localhost:' + karate.properties['jersey.ssl.port']

Scenario Outline:
    Given path '<contextPath>'
    When method get
    Then status 200
    And match response == { success: true }
    Examples:
    | applicationPaths |

注释掉karate-config.js中readTimeout和connectTimeout的配置,测试成功。取消注释后,测试将失败并出现 PKIX 路径构建失败。

应该没有任何改变。我知道这很难,但请尝试提供一个样本供我们复制。

我们在 CI 中进行了一些测试 运行 - 也许您可以将它们用作参考:https://github.com/intuit/karate/tree/v1.0.1/karate-demo/src/test/java/ssl