【问题标题】:PKIX Path Building failed after upgrading from 0.9.6 to 1.0.x karate version [duplicate]从 0.9.6 升级到 1.0.x 空手道版本后,PKIX 路径构建失败 [重复]
【发布时间】:2021-05-25 01:00:27
【问题描述】:

我试图将我们的空手道测试从 0.9.6 版本升级到 1.0.x 版本。我已经使用 ssl 配置在功能文件中定义了密钥库和信任库,它们在 0.9.6 版本的空手道中运行良好。当我更改为使用 1.0.x 版本的空手道时,我收到 PKIX Path Building 失败:

javax.net.ssl|错误|1B|pool-1-thread-1|2021-05-22 17:18:20.212 CDT|TransportContext.java:318|致命(CERTIFICATE_UNKNOWN):PKIX 路径 构建失败: sun.security.provider.certpath.SunCertPathBuilderException:无法 找到请求目标的有效认证路径(“throwable”:{
sun.security.validator.ValidatorException:PKIX 路径构建失败: sun.security.provider.certpath.SunCertPathBuilderException:无法 找到请求目标的有效认证路径

我在 karate ApacheHttpClient 类中添加了断点,我可以看到 Keystore 和 TrustStores 正在设置中,并且在使用 -Djavax.net.debug= 运行时验证受信任证书是否被添加为受信任证书全部。

我什至添加了发送到信任库的特定服务器证书。我似乎找不到在 1.0.x 版本的空手道上收到 PKIX 失败的根本原因,但完全相同的配置在 0.9.6 版本中运行良好。我还验证了正在发送的服务器证书的完整链中的 CA 是否包含在我的信任库中。似乎一旦发送请求,我的信任存储就会被忽略。

对于 karate 1.0.x 中的 TLS 连接可能有什么不同有什么想法吗?据我从文档中得知,ssl 配置选项没有改变。


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

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

空手道配置.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 路径构建失败。

【问题讨论】:

  • 我更新了上面的帖子,包括可以对空手道 SSL 演示进行的更改以复制问题。

标签: java ssl karate


【解决方案1】:

什么都不应该改变。我知道这很难,但请尝试提供一个样本供我们复制。

我们在这里有几个在 CI 中运行的测试 - 也许您可以将它们用作参考:https://github.com/intuit/karate/tree/v1.0.1/karate-demo/src/test/java/ssl

【讨论】:

  • Peter,我发现我的本地问题是由在 karate-config.js 中设置 connectTimeout 或 readTimeout 并使用 Scenario Outline 迭代场景引起的。我的本地示例也确实在功能文件的 ssl 配置中设置了密钥库、信任库和算法。
  • @jcruse248 有一个关于场景大纲重置配置的错误,希望是:github.com/intuit/karate/issues/1560 - 您可以通过尝试 1.1.0.RC1 来确认
  • 我已经确认1.1.0.RC1版本已经解决了这个问题。感谢您的帮助!
猜你喜欢
  • 2019-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-02
  • 1970-01-01
  • 2016-09-16
  • 2018-10-04
  • 1970-01-01
相关资源
最近更新 更多