Rest Assured带证书发起HTTPS GET调用找不到有效证书路径如何解决
问题修复方案
该PKIX报错的核心原因是JVM无法找到可信任的证书链来验证目标HTTPS服务端返回的证书,你当前的代码只配置了服务端证书信任库,若你需要携带客户端证书做双向认证,还需要额外配置密钥库,同时要确认信任库中包含了目标服务端证书的根/中级签发证书。
场景1:需要做双向TLS认证(服务端要求客户端上传证书校验身份)
- 你当前调用的
trustStore()方法作用是配置信任服务端证书的信任库,要上传客户端证书需要额外调用keyStore()方法,修改代码如下:
// keyStore填客户端证书jks路径和密码,trustStore填信任服务端证书的jks路径和密码 Response resp=given() .keyStore("C:\\Users\\userName\\clientcert.jks","Password") .trustStore("C:\\Users\\userName\\clientcert.jks","Password") .param("reportId", "111") .param("startDate","2020-01-01") .param("endDate", "2020-01-01") .when().get(path); resp.prettyPrint();
如果服务端根证书和客户端证书存在不同的jks文件中,替换trustStore参数为对应信任库的路径和密码即可。
- 确认jks文件中已导入目标服务端的根证书、中级签发证书:可通过JDK自带keytool命令验证
keytool -list -v -keystore 你的jks文件路径 -storepass 你的jks密码,如果缺少对应证书,需要先导出目标服务端的证书,再导入到信任库中。
场景2:不需要双向认证,仅测试环境临时跳过服务端证书校验(生产环境不推荐)
- 直接配置Rest Assured放松SSL校验,无需提前导入服务端证书:
Response resp=given() .relaxedHTTPSValidation() // 不需要传客户端证书可以删除下面的keyStore配置 .keyStore("C:\\Users\\userName\\clientcert.jks","Password") .param("reportId", "111") .param("startDate","2020-01-01") .param("endDate", "2020-01-01") .when().get(path); resp.prettyPrint();
通用排查点
- 确认pfx转jks的操作正确,转换命令参考:
keytool -importkeystore -srckeystore 源pfx文件路径 -srcstoretype pkcs12 -destkeystore 生成的jks文件路径 -deststoretype jks,输入密码时注意大小写、前后不要带空格。 - 确认代码中填写的jks路径、密码和实际文件配置一致,没有拼写错误。
内容的提问来源于stack exchange,提问作者Javahir Jafarguliyeva
相关产品推荐
相关产品推荐

