首页 > 编程语言 >Java中调用https报证书不存在问题的解决方案

Java中调用https报证书不存在问题的解决方案

时间:2022-11-21 14:11:55浏览次数:42  
标签:Java JDK 证书 解决方案 xxx https sun java security

Java中调用https报证书不存在问题的解决方案

报错现象

后台日志中有如下报错信息:

Caused by: 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.validator.PKIXValidator.doBuild(PKIXValidator.java:439)
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:306)
at sun.security.validator.Validator.validate(Validator.java:271)
at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:312)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:221)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:128)
at sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:636)
... 76 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

问题原因

当我们使用Java去进行https的调用时,Java需要对服务端的证书进行认证,如果这个证书不在JDK的授信证书链名单内,那JDK就无法对该服务器证书进行认证,就会导致证书认证失败。

解决办法,在JDK中授信证书列表中添加请求服务器端的证书

命令在bash中执行,windows cmd中第一步可以用浏览器,第二步 $JAVA_HOME 改为 %JAVA_HOME%:

  1. 获取所访问的SSL站点服务端证书为 xxx.cert,其中127.0.0.1:8443改为实际的网站地址(也可以在浏览器中导出证书):
echo -n | openssl s_client -connect 127.0.0.1:8443 | sed -ne'/BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > xxx.cert
  1. 将获取的服务端证书链加入到JDK授信证书列表中(keytool是JDK中的标准命令,所以,需要先把JDK的bin目录添加到path中,或者使用 $JAVA_HOME/bin/keytool 进行调用):
keytool -importcert -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit -alias xxx -file xxx.cert

这样,就可以把xxx.cert中的证书信息导入到JDK的授信证书列表cacerts中了。

其他参考命令

  1. 查看:
keytool -list -v -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit -alias xxx
  1. 删除:
keytool -delete -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit -alias xxx

标签:Java,JDK,证书,解决方案,xxx,https,sun,java,security
From: https://www.cnblogs.com/yangwen0228/p/16911244.html

相关文章

  • java类初始化过程以及类加载过程
    1、类初始化 1.1、类初始话原则先初始化静态部分,再初始化动态部分(先静后动)先初始化父类部分,再初始化子类部分(先父再子)先初始化变量,次初始化代码块,再初始化构造器(先变......
  • Java序列化与反序列化
    序列化保证对象可传递性和完整性将对象转为字节流,可以保存在本地或在网上传输保存对象状态和重建反序列化根据字节流,重建对象为什么需要序列化与反序列化分布式对象......
  • java File类与文件输入/输出流:FileInputStream与FileOutputStream
    javaFile类与文件输入/输出流File类File类是java.io包中唯一代表磁盘文件本身的类,该类主要用于文件和目录的创建、文件的查找和文件的删除等。文件的创建与删除1.Fi......
  • 今天在学习javaWeb遇到run正常,debug无法启动问题
    问题:项目run正常,debug无法启动首先看控制台报错ERROR:transporterror202:connectfailed:ConnectionrefusedERROR:JDNPTransportdt_socketfailedtoinitialize......
  • JAVA中的高并发
    1什么是高并发1.1高并发(HighConcurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。1.2高并发相关常用的......
  • eslint插件屁事多,解决方案
    eslint插件会检测是否写了分号,写了分号就报错,那么我们就设置一个文件".prettierrc"文件在里面写"semi":false从而在格式化代码的时候自动将分号去掉;写"singleQuote"......
  • java报错:The reference to entity
    java关于报错:Thereferencetoentity"characterEncoding"mustendwiththe';'delimiter.Java解析XML文件错误。错误信息提示代码类似如下:Thereferencetoentity"......
  • java学习的路线和高效的学习方法
    后端路线:java基础   java集合框架javaio流java注解与反射    javaWeb     学会使用gitsql和学习jdbc     学习mybatis学习spring  ......
  • 使用UDP协议实现简单的分布式日志服务, java和python
    使用UDP协议实现简单的分布式日志服务,java和python这几天系统出现问题,需要查原因.日志分散在各个服务器上,查起来很要命.网上百度了好久,最后发现,各种日志的处理......
  • Java 同步锁ReentrantLock与抽象同步队列AQS
    AbstractQueuedSynchronizer抽象同步队列,它是个模板类提供了许多以锁相关的操作,常说的AQS指的就是它。AQS继承了​​AbstractOwnableSynchronizer​​类,AOS用于保存线程对......