0

I am totally new to jackson api , i was trying to get data from https://www.cyb3rpirat3s.in/android/leaderboard.php in form of json but on execution it is throwing me below exception... please help and do correct me.... thanks in advance.

public class DataBindingFilter {
    public static void main(String[] args) throws JsonParseException, JsonMappingException, MalformedURLException, IOException {
        String url = "https://www.cyb3rpirat3s.in/android/leaderboard.php";
        ObjectMapper mapper = new ObjectMapper();
        mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
        AlbumFilter info = mapper.readValue(new URL(url), AlbumFilter.class);
        System.out.println(info.getLevel());
        System.out.println(info.getPirateName());
        System.out.println(info.getRank());
    }

}

AlbumFilter Class

@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.PUBLIC_ONLY)
public class AlbumFilter {
    private String pirateName;
    private String level;
    private String rank;
    protected String getPirateName() {
        return pirateName;
    }

    public String getLevel() {
        return level;
    }
    public String getRank(){
        return rank;
    }
}

Logcat error

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
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1884)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:270)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1341)
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:153)
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:804)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1300)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
    at java.net.URL.openStream(URL.java:1037)
    at com.fasterxml.jackson.core.JsonFactory._optimizedStreamFromURL(JsonFactory.java:935)
    at com.fasterxml.jackson.core.JsonFactory.createJsonParser(JsonFactory.java:527)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1782)
    at jackson.DataBindingFilter.main(DataBindingFilter.java:17)
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:385)
    at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
    at sun.security.validator.Validator.validate(Validator.java:260)
    at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:326)
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:231)
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:126)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1323)
    ... 16 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:196)
    at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:268)
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:380)
    ... 22 more
DRY Believer
  • 980
  • 10
  • 20
  • 1
    possible duplicate of [Resolving javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed Error?](http://stackoverflow.com/questions/9619030/resolving-javax-net-ssl-sslhandshakeexception-sun-security-validator-validatore) – Evan Knowles Nov 18 '14 at 06:48
  • This has nothing to do with Jackson proper; the keystore used by your JVM is unable to find a root CA for your site. – fge Nov 18 '14 at 06:51

1 Answers1

1

As the guys explained in the comments, the issue is related to a missing certificate. A link in the comment suggests a way of how to install the certificate. There's another way, viable for testing. You can use the following utility class

public class SSLCertificate {
    public static void disableSSLVerifier() throws NoSuchAlgorithmException, KeyManagementException {
        // Create a trust manager that does not validate certificate chains
        TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
            public void checkClientTrusted(X509Certificate[] certs, String authType) {
            }
            public void checkServerTrusted(X509Certificate[] certs, String authType) {
            }
        }
        };

        // Install the all-trusting trust manager
        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);
    }

    public static HttpClient getTestHttpClient(int port) {
        try {

            // Create all-trusting host name verifier
            X509HostnameVerifier allHostsValid = new X509HostnameVerifier() {

                public void verify(String host, SSLSocket ssl) throws IOException {
                    //Todo: missing implementation
                }

                public void verify(String host, X509Certificate cert) throws SSLException {
                    //Todo: missing implementation
                }

                public void verify(String host, String[] cns, String[] subjectAlts) throws SSLException {
                    //Todo: missing implementation
                }

                public boolean verify(String s, SSLSession sslSession) {
                    return true;  //Todo: missing implementation
                }
            };
            org.apache.http.conn.ssl.SSLSocketFactory sf = new org.apache.http.conn.ssl.SSLSocketFactory(new TrustStrategy(){
                public boolean isTrusted(X509Certificate[] chain,
                                         String authType) throws CertificateException {
                    return true;
                }
            }, allHostsValid);

            SchemeRegistry registry = new SchemeRegistry();
            registry.register(new Scheme("https", port, sf));
            ClientConnectionManager ccm = new ThreadSafeClientConnManager(registry);
            return new DefaultHttpClient(ccm);
        } catch (Exception e) {
            return new DefaultHttpClient();
        }
    }

}

and just call

SSLCertificate.disableSSLVerifier(); 

at the beginning of your method

Master Slave
  • 26,268
  • 4
  • 56
  • 55