问题描述

最近在写代码的时候,在使用jsoup访问https的链接时,出现如下异常信息:

异常信息

出现原因

这个异常的原因通常是,java程序在与目标链接建立https安全连接时无法验证服务器的SSL证书引起的,因为在JDK的证书路径构造器中无法找到一条从服务器证书到受信任的跟证书的有效路径,出现这种原因可能有以下几种:

  1. 证书不受信任:服务器的根证书没有被Java的证书库信任
  2. 中间证书缺失:服务器可能缺少中间证书,从而无法建立完整的证书链
  3. 证书过期或者无效:服务器的证书可能已经过期或者失效

解决方法

对于 中间证书缺失证书过期或者无效这两种情况,一般是由对应目标服务的管理员去进行维护的,下面主要演示如何解决第一种证书不受信任的情况如何解决

将服务器的根证书导入Java的证书库中

  1. 下载根证书

    • 通过浏览器下载
      下载网站ssl证书-点击连接是安全的
      导出ssl证书-命名为.cer格式

    • 通过命令下载
      echo | openssl s_client -connect www.csdn.net:443 | openssl x509 > csdn.cer

    • 通过 InstallCert.java 生成 (推荐使用

      InstallCert.java 是一个java编写的证书安装程序,可根据提供的host下载对应的证书,使用操作步骤如下:

      1. 下载 InstallCert.java

        curl https://raw.githubusercontent.com/escline/InstallCert/master/InstallCert.java -O

      2. 编译 InstallCert.java

        javac InstallCert.java

      3. 获取证书

        • 执行 java InstallCert www.csdn.net:443,紧接着在弹出的Enter certificate to add to trusted keystore or 'q' to quit: [1] 按下回车,将会在当前目录下生成一个jssecacerts的密钥库
        • 从jssecacerts 密钥库中提取证书 keytool -exportcert -alias www.csdn.net-1 -keystore jssecacerts -storepass changeit -file www.csdn.net.cer
  2. 将根证书导入到Java证书库

    通过 通过keytool -importcert将证书文件导入到Java证书库

    # java8
    sudo keytool -importcert -alias www.csdn.net -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit -file www.csdn.net.cer
    # java17
    sudo keytool -importcert -alias www.csdn.net -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit -file www.csdn.net.cer
    
  3. 输入证书库密码,默认为 changeit,在提示的是否信任此证书?输入 ‘y’,即添加成功,然后重启java程序即可。

Logo

一站式 AI 云服务平台

更多推荐