遇到一个及其恶心的问题,如标题所示,在网上找了很久,有两种解决方案:
1.跳过认证
多数人认为这种方案不适用于生产环境,故不讨论。
2.在Java环境中添加这个证书。
具体分成两步,下载和导入。
2-1.下载
通过浏览器获取一个.der文件(不要随意用别人给的)
2-2.导入
导入分成两种方案,默认路径和指定路径。
(1)默认路径导入
进入到/jdk/jre/lib/security 目录
keytool -import -alias cacerts[随便起名] -file abc.der[你导出的证书] -keystore cacerts -storepass changeit
校验是否导入成功:keytool -list -v -keystore cacerts -alias cacerts[和导入时,起的别名一致]-storepass changeit
删除:keytool -delete -keystore cacerts -alias cacerts[和导入时,起的别名一致] -storepass changeit
此时Java项目中就可以直接使用https协议了。
这个方案里面藏着一个约定"Java应用会默认找到 /jdk/jre/lib/security/cacerts"文件
(2)指定路径导入(如果你想把证书另存到其他文件)
进入到/jdk/jre/lib/security 目录
keytool -import -alias cacerts[随便起名] -file abc.der[你导出的证书] -keystore abc.jks[随便起名] -storepass changeit
校验是否导入成功:keytool -list -v -keystore abc.jks[和生成时的文件一致] -alias cacerts[和导入时,起的别名一致] -storepass changeit
删除:keytool -delete -keystore abc.jks[和生成时的文件一致] -alias cacerts[和导入时,起的别名一致] -storepass changeit
(注意,删除的是当前目录下abc.jks文件中的别名为cacerts的证书,如果你把这个文件拷贝到其它目录了,就删除不到了,拷贝的文件也不会受到影响)
此时,就需要指定证书地址了(证书名变了,路径也就变了,不可用默认约定了):
Properties props = System.getProperties();
props.put("javax.net.ssl.trustStore","C:\\Program Filles\\Java\\jdk1.8.0_11\\jre\\lib\\security\\abc.jks");//C:\\Program Filles\\Java\\jdk1.8.0_11\\jre\\lib\\security\\abc.jks是证书路径
props.put("javax.net.ssl.trustStorePassword","changeit");
System.setProperties(props);
参考文档:https://www.cnblogs.com/zoro-zero/p/11607674.html