上一节我们分别设置了认证服务为https服务,所以在资源服务器或者其他微服务调用时会需要认证去
如果直接调用会出现如下问题:
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) ~[na:1.8.0_162] at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1964) ~[na:1.8.0_162] at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:328) ~[na:1.8.0_162] at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:322) ~[na:1.8.0_162]....
上面这个问题归结起来就是无法验证网站的证书,找不到证书验证链
针对这个问题,Java的证书验证系统与其他不同,将代理工具生成的证书作为可信根证书导入系统证书库,是存在问题的。在java的认证需要使用JRE中证书库,所有必须把代理工具的证书加入到JRE的证书库中。下面解决步骤:
首先jre证书路径在\jre\lib\security的目录下有个文件名cacerts
2.使用Keytool管理证书,路径在\jdk8\bin\keytool.exe下
F:\softinstall\jdk8\bin>keytool -help 密钥和证书管理工具 命令: -certreq 生成证书请求 -changealias 更改条目的别名 -delete 删除条目 -exportcert 导出证书 -genkeypair 生成密钥对 -genseckey 生成密钥 -gencert 根据证书请求生成证书 -importcert 导入证书或证书链 -importpass 导入口令 -importkeystore 从其他密钥库导入一个或所有条目 -keypasswd 更改条目的密钥口令 -list 列出密钥库中的条目 -printcert 打印证书内容 -printcertreq 打印证书请求的内容 -printcrl 打印 CRL 文件的内容 -storepasswd 更改密钥库的存储口令 使用 "keytool -command_name -help" 获取 command_name 的用法
获取证书
之前浏览器访问security-service时保存了证书,为了方便我直接导出来,为下一步导入jre准备
图片.png
执行命令将代理工具的证书加入到cacerts中
keytool -importcert -alias FIDDLER -keystore ../jre/lib/security/cacerts -file ../../record/xzg.crt
提示设置输入口令,java默认口令是changeit,也可以设置其他口令,最后输入y信任此证书,执行成功后
图片.png
查看是否存在jre证书,密码为上述设置的密码:
keytool -list -keystore ../jre/lib/security/cacerts
作者:勃列日涅夫
链接:https://www.jianshu.com/p/e65b1ec2f447