zoukankan      html  css  js  c++  java
  • unable to find valid certification path to requested target

    Error :

    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

    Resolve method :

      1 import java.io.BufferedReader;
      2 import java.io.File;
      3 import java.io.FileInputStream;
      4 import java.io.FileOutputStream;
      5 import java.io.InputStream;
      6 import java.io.InputStreamReader;
      7 import java.io.OutputStream;
      8 import java.security.KeyStore;
      9 import java.security.MessageDigest;
     10 import java.security.cert.CertificateException;
     11 import java.security.cert.X509Certificate;
     12 
     13 import javax.net.ssl.SSLContext;
     14 import javax.net.ssl.SSLException;
     15 import javax.net.ssl.SSLSocket;
     16 import javax.net.ssl.SSLSocketFactory;
     17 import javax.net.ssl.TrustManager;
     18 import javax.net.ssl.TrustManagerFactory;
     19 import javax.net.ssl.X509TrustManager;
     20 
     21 public class InstallCert {
     22 
     23     public static void main(String[] args) throws Exception {
     24         args[0]="www.google.com";
     25         String host;
     26         int port;
     27         char[] passphrase;
     28         //System.setProperty("javax.net.ssl.trustStore", "C:\Users\PL62716\workspace\urlAutoConnect\jssecacerts");
     29         if ((args.length == 1) || (args.length == 2)) {
     30             String[] c = args[0].split(":");
     31             host = c[0];
     32             port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
     33             String p = (args.length == 1) ? "changeit" : args[1];
     34             passphrase = p.toCharArray();
     35         } else {
     36             System.out
     37                     .println("Usage: java InstallCert <host>[:port] [passphrase]");
     38             return;
     39         }
     40 
     41         File file = new File("jssecacerts");
     42         if (file.isFile() == false) {
     43             char SEP = File.separatorChar;
     44             File dir = new File(System.getProperty("java.home") + SEP + "lib"
     45                     + SEP + "security");
     46             file = new File(dir, "jssecacerts");
     47             if (file.isFile() == false) {
     48                 file = new File(dir, "cacerts");
     49             }
     50         }
     51         System.out.println("Loading KeyStore " + file + "...");
     52         InputStream in = new FileInputStream(file);
     53         KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
     54         ks.load(in, passphrase);
     55         in.close();
     56 
     57         SSLContext context = SSLContext.getInstance("TLS");
     58         TrustManagerFactory tmf = TrustManagerFactory
     59                 .getInstance(TrustManagerFactory.getDefaultAlgorithm());
     60         tmf.init(ks);
     61         X509TrustManager defaultTrustManager = (X509TrustManager) tmf
     62                 .getTrustManagers()[0];
     63         SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
     64         context.init(null, new TrustManager[] { tm }, null);
     65         SSLSocketFactory factory = context.getSocketFactory();
     66 
     67         System.out
     68                 .println("Opening connection to " + host + ":" + port + "...");
     69         SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
     70         socket.setSoTimeout(10000);
     71         try {
     72             System.out.println("Starting SSL handshake...");
     73             socket.startHandshake();
     74             socket.close();
     75             System.out.println();
     76             System.out.println("No errors, certificate is already trusted");
     77         } catch (SSLException e) {
     78             System.out.println();
     79             e.printStackTrace(System.out);
     80         }
     81 
     82         X509Certificate[] chain = tm.chain;
     83         if (chain == null) {
     84             System.out.println("Could not obtain server certificate chain");
     85             return;
     86         }
     87 
     88         BufferedReader reader = new BufferedReader(new InputStreamReader(
     89                 System.in));
     90 
     91         System.out.println();
     92         System.out.println("Server sent " + chain.length + " certificate(s):");
     93         System.out.println();
     94         MessageDigest sha1 = MessageDigest.getInstance("SHA1");
     95         MessageDigest md5 = MessageDigest.getInstance("MD5");
     96         for (int i = 0; i < chain.length; i++) {
     97             X509Certificate cert = chain[i];
     98             System.out.println(" " + (i + 1) + " Subject "
     99                     + cert.getSubjectDN());
    100             System.out.println("   Issuer  " + cert.getIssuerDN());
    101             sha1.update(cert.getEncoded());
    102             System.out.println("   sha1    " + toHexString(sha1.digest()));
    103             md5.update(cert.getEncoded());
    104             System.out.println("   md5     " + toHexString(md5.digest()));
    105             System.out.println();
    106         }
    107 
    108         System.out
    109                 .println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
    110         String line = reader.readLine().trim();
    111         int k;
    112         try {
    113             k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
    114         } catch (NumberFormatException e) {
    115             System.out.println("KeyStore not changed");
    116             return;
    117         }
    118 
    119         X509Certificate cert = chain[k];
    120         String alias = host + "-" + (k + 1);
    121         ks.setCertificateEntry(alias, cert);
    122 
    123         OutputStream out = new FileOutputStream("jssecacerts");
    124         ks.store(out, passphrase);
    125         out.close();
    126 
    127         System.out.println();
    128         System.out.println(cert);
    129         System.out.println();
    130         System.out
    131                 .println("Added certificate to keystore 'jssecacerts' using alias '"
    132                         + alias + "'");
    133     }
    134 
    135     private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();
    136 
    137     private static String toHexString(byte[] bytes) {
    138         StringBuilder sb = new StringBuilder(bytes.length * 3);
    139         for (int b : bytes) {
    140             b &= 0xff;
    141             sb.append(HEXDIGITS[b >> 4]);
    142             sb.append(HEXDIGITS[b & 15]);
    143             sb.append(' ');
    144         }
    145         return sb.toString();
    146     }
    147 
    148     private static class SavingTrustManager implements X509TrustManager {
    149 
    150         private final X509TrustManager tm;
    151         private X509Certificate[] chain;
    152 
    153         SavingTrustManager(X509TrustManager tm) {
    154             this.tm = tm;
    155         }
    156 
    157         public X509Certificate[] getAcceptedIssuers() {
    158             throw new UnsupportedOperationException();
    159         }
    160 
    161         public void checkClientTrusted(X509Certificate[] chain, String authType)
    162                 throws CertificateException {
    163             throw new UnsupportedOperationException();
    164         }
    165 
    166         public void checkServerTrusted(X509Certificate[] chain, String authType)
    167                 throws CertificateException {
    168             this.chain = chain;
    169             tm.checkServerTrusted(chain, authType);
    170         }
    171     }
    172 
    173 }
    View Code
    java InstallCert www.twitter.com  
    Loading KeyStore /usr/java/jdk1.6.0_16/jre/lib/security/cacerts...  
    Opening connection to www.twitter.com:443...  
    Starting SSL handshake...  
      
    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 com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:150)  
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1476)  
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:174)  
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:168)  
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:846)  
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:106)  
        at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:495)  
        at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:433)  
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:815)  
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1025)  
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1038)  
        at InstallCert.main(InstallCert.java:63)  
    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:221)  
        at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:145)  
        at sun.security.validator.Validator.validate(Validator.java:203)  
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:172)  
        at InstallCert$SavingTrustManager.checkServerTrusted(InstallCert.java:158)  
        at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(SSLContextImpl.java:320)  
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:839)  
        ... 7 more  
    Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target  
        at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:236)  
        at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:194)  
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:216)  
        ... 13 more  
      
    Server sent 2 certificate(s):  
      
     1 Subject CN=www.twitter.com, O=example.com, C=US  
       Issuer  CN=Certificate Shack, O=example.com, C=US  
       sha1    2e 7f 76 9b 52 91 09 2e 5d 8f 6b 61 39 2d 5e 06 e4 d8 e9 c7   
       md5     dd d1 a8 03 d7 6c 4b 11 a7 3d 74 28 89 d0 67 54   
      
     2 Subject CN=Certificate Shack, O=example.com, C=US  
       Issuer  CN=Certificate Shack, O=example.com, C=US  
       sha1    fb 58 a7 03 c4 4e 3b 0e e3 2c 40 2f 87 64 13 4d df e1 a1 a6   
       md5     72 a0 95 43 7e 41 88 18 ae 2f 6d 98 01 2c 89 68   
      
    Enter certificate to add to trusted keystore or 'q' to quit: [1]  
    run application result

    (1) Input 1, Enter, will generate Security certificate named "jssecacerts"

    (2) Copy this file "jssecacerts" to directory "$JAVA_HOME/jre/lib/security"  or use the following way: System.setProperty("javax.net.ssl.trustStore", "你的jssecacerts证书路径");

    (3) Restart the web  server, the certificate will take effect.

  • 相关阅读:
    String数组转换成Integer数组
    码云远程仓库用户名和密码修改了,本地如何删除修改?
    Git操作过程(码云)
    SpringCloud应用之配置中心Nacos
    SpringCloud应用之网关GateWay
    SpringCloud应用之熔断器Hystrix
    SpringCloud应用之服务调用Feign
    装饰者设计模式
    Spring 自动装配及其注解
    Spring Bean自动装配有哪些方式?
  • 原文地址:https://www.cnblogs.com/liupuLearning/p/5845877.html
Copyright © 2011-2022 走看看