从 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
我试图将我们的工作空手道测试从 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