How to ignore PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException?

前端 未结 8 668
旧巷少年郎
旧巷少年郎 2020-11-28 03:29

I got the following exception when try to post a request to a http server:

Here is the code I used

URL url = new URL(
        \"https://www.abc.com\"         


        
相关标签:
8条回答
  • 2020-11-28 04:28

    If the issue is a missing intermediate certificate, you can enable Oracle JRE to automatically download the missing intermediate certificate as explained in this answer.

    Just set the Java system property -Dcom.sun.security.enableAIAcaIssuers=true

    For this to work the server's certificate must provide the URI to the intermediate certificate (the certificate's issuer). As far as I can tell, this is what browsers do as well and should be just as secure - I'm not a security expert though.

    Edit: If I recall correctly, this seems to work at least with Java 8 and is documented here for Java 9.

    0 讨论(0)
  • 2020-11-28 04:32

    I have used the below code to override the SSL checking in my project and it worked for me.

    package com.beingjavaguys.testftp;
    
    import java.io.InputStreamReader;
    import java.io.Reader;
    import java.net.URL;
    import java.net.URLConnection;
    
    import javax.net.ssl.HostnameVerifier;
    import javax.net.ssl.HttpsURLConnection;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLSession;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.X509TrustManager;
    import java.security.cert.X509Certificate;
    
    /**
     * Fix for Exception in thread "main" 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
     */
    public class ConnectToHttpsUrl {
        public static void main(String[] args) throws Exception {
            /* Start of Fix */
            TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
                public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; }
                public void checkClientTrusted(X509Certificate[] certs, String authType) { }
                public void checkServerTrusted(X509Certificate[] certs, String authType) { }
    
            } };
    
            SSLContext sc = SSLContext.getInstance("SSL");
            sc.init(null, trustAllCerts, new java.security.SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    
            // Create all-trusting host name verifier
            HostnameVerifier allHostsValid = new HostnameVerifier() {
                public boolean verify(String hostname, SSLSession session) { return true; }
            };
            // Install the all-trusting host verifier
            HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
            /* End of the fix*/
    
            URL url = new URL("https://nameofthesecuredurl.com");
            URLConnection con = url.openConnection();
            Reader reader = new InputStreamReader(con.getInputStream());
            while (true) {
                int ch = reader.read();
                if (ch == -1) 
                    break;
                System.out.print((char) ch);
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题