【发布时间】: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 演示进行的更改以复制问题。