Java 从0.9.6升级到1.0.x空手道版本后,PKIX路径生成失败
我试图将我们的空手道测试从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:无法 找到请求目标的有效证书路径(“可丢弃”){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
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演示所做的更改复制这个问题。