上一节我们分别设置了认证服务为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准备
- 执行命令将代理工具的证书加入到cacerts中
keytool -importcert -alias FIDDLER -keystore ../jre/lib/security/cacerts -file ../../record/xzg.crt
提示设置输入口令,java默认口令是changeit,也可以设置其他口令,最后输入y信任此证书,执行成功后
- 查看是否存在jre证书,密码为上述设置的密码:
keytool -list -keystore ../jre/lib/security/cacerts
至此执行加入证书库完成
微服务项目地址