Java 从0.9.6升级到1.0.x空手道版本后,PKIX路径生成失败

Java 从0.9.6升级到1.0.x空手道版本后,PKIX路径生成失败,java,ssl,karate,Java,Ssl,Karate,我试图将我们的空手道测试从0.9.6版升级到1.0.x版。我已经使用ssl配置在功能文件中定义了密钥存储库和信任存储库,它们在0.9.6版本的karate中运行良好。当我改为使用1.0.x版的空手道时,我收到PKIX路径构建失败: javax.net.ssl | ERROR | 1B | pool-1-thread-1 | 2021-05-22 17:18:20.212 CDT | TransportContext.java:318 |致命(证书|未知):PKIX路径 建筑失败: sun.sec

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

javax.net.ssl | ERROR | 1B | pool-1-thread-1 | 2021-05-22 17:18:20.212 CDT | TransportContext.java:318 |致命(证书|未知):PKIX路径 建筑失败: sun.security.provider.certpath.SunCertPathBuilderException:无法 找到请求目标的有效证书路径(“可丢弃”){
sun.security.validator.validator异常:PKIX路径生成失败: sun.security.provider.certpath.SunCertPathBuilderException:无法 找到请求目标的有效证书路径

我已经在karate ApacheHttpClient类中添加了断点,我可以看到密钥库和信任库正在被设置,并且在使用-Djavax.net.debug=all运行时,验证受信任的证书是否被添加为受信任的证书

我甚至添加了发送到信任存储区的特定服务器证书。我似乎找不到在1.0.x版本的空手道上收到PKIX失败的根本原因,但在0.9.6版本中,完全相同的配置可以正常工作。我还验证了发送的服务器证书的完整链中包含的CAs在我的信任存储中。似乎一旦发送请求,我的信任存储就被忽略了

关于Karate1.0.x中的TLS连接有什么不同的想法吗?据我从文档中所知,ssl配置选项没有改变


用空手道演示复制:

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

karate-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 |
功能:具有信任存储/证书的ssl
背景:
*配置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']
情景大纲:
给定路径“”
当方法得到
然后状态200
和匹配响应=={success:true}
示例:
|应用程序路径|

如果您在karate-config.js中注释掉readTimeout和connectTimeout的配置,则测试成功。如果未注释,则测试将失败,因为PKIX路径构建失败。

不应更改任何内容。我知道这很难,但请尝试提供一个示例供我们复制


我们这里有两个在CI中运行的测试-也许您可以将它们用作参考:

Peter,我发现我的本地问题是由于在karate-config.js中设置了connectTimeout或readTimeout,并使用场景大纲对场景进行迭代造成的。我的本地示例也在t中设置了密钥库、信任库和算法功能文件上的ssl配置。@jcruse248在场景大纲的配置重置中有一个错误,希望是:-您可以通过尝试1.1.0.RC1I进行确认我已经确认1.1.0.RC1版本已经解决了这个问题。谢谢您的帮助!我更新了上面的帖子,以包括可以对空手道ssl演示所做的更改复制这个问题。