admin管理员组

文章数量:1567253

linux服务器下解决SSL证书不受信的问题

    • linux服务器下解决SSL证书不受信的问题
      • 安装SSL证书安装到jdk证书库
      • 第二种代码层面忽略证书信任问题。

你好! 这是你的第一篇博文,以后就在这里和大家交流和学习喽。

linux服务器下解决SSL证书不受信的问题

java应用程序下访问第三方服务,调用https服务时,本地不报错,服务器报javax.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 这个错误。如何解决这个问题。两种方案,第一种安装不受信任的SSL证书到jdk证书库,第二种是忽略SSL证书信任。

安装SSL证书安装到jdk证书库

1.在google浏览器,访问第三方接口域名,在设置中,查找对应的证书, 导出到本地,具体可以参考https://jingyan.baidu/article/90895e0f34fad464ec6b0b1e.html
2.安装证书
查找 jdk安装位置 echo $JAVA_HOME

 cd  /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.151-1.b12.el7_4.x86_64
进入证书库
cd  /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.151- 1.b12.el7_4.x86_64/jre/lib/security
执行命令:
 cd /usr/java/jre1.8.0_73/lib/security/
keytool -import -alias 证书名 -keystore cacerts -file 证书路径/对应的域名.cer -trustcacerts
此时命令行会提示你输入cacerts证书库的密码,你敲入changeit就行了,这是java中cacerts证书库的默认密码。

第二种代码层面忽略证书信任问题。

上代码:
package com.linkGap.baobei.utils;

import javax.ssl.*;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

/**

  • @Description 解决忽略SSL证书问题

  • @Date 20/12/1 下午4:49

  • @Version 1.0
    **/
    public class IgnoreSSL {

    private static void trustAllHttpsCertificates() throws Exception {
    TrustManager[] trustAllCerts = new TrustManager[1];
    TrustManager tm = new MyTM();
    trustAllCerts[0] = tm;
    SSLContext sc = SSLContext.getInstance(“SSL”);
    sc.init(null, trustAllCerts, null);
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    }

    static class MyTM implements TrustManager, X509TrustManager {
    @Override
    public X509Certificate[] getAcceptedIssuers() {
    return null;
    }

     public boolean isServerTrusted(X509Certificate[] certs) {
         return true;
     }
    
     public boolean isClientTrusted(X509Certificate[] certs) {
         return true;
     }
    
     @Override
     public void checkServerTrusted(X509Certificate[] certs, String authType)
             throws CertificateException {
         return;
     }
    
     @Override
     public void checkClientTrusted(X509Certificate[] certs, String authType)
             throws CertificateException {
         return;
     }
    

    }

    /**

    • 忽略HTTPS请求的SSL证书,必须在openConnection之前调用
    • @throws Exception
      */
      public static void ignoreSsl() throws Exception{
      HostnameVerifier hv = new HostnameVerifier() {
      @Override
      public boolean verify(String urlHostName, SSLSession session) {
      return true;
      }
      };
      System.out.println(“忽略HTTPS请求的SSL证书”);
      trustAllHttpsCertificates();
      HttpsURLConnection.setDefaultHostnameVerifier(hv);
      }

    }
    在调用HTTPConnection之前执行执行IgnoreSSL.ignoreSsl();就解决问题了,代码亲测有用

欢迎大家参考,指正评论

本文标签: 这一不受证书服务器就够了