Soru & Cevap

ksoap2 ile web service erişirken SSLHandshakeException ?

02.03.2015 - 04:45

Arkadaşlar selamlar,

 

Uzun bir süredir aşağıdaki methodla çalışan android uygulamamda, Web Service için kullanılan GeoTrust sertifikasını güncelledikten sonra problem yaşamaya başladım.  

[code]

        LoginEntity object = new LoginEntity();

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
        request.addProperty("username", username);
        request.addProperty("password", password);

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet = true;
        envelope.setOutputSoapObject(request);

        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        androidHttpTransport.debug = true;

        try {
            androidHttpTransport.call(SOAP_ACTION, envelope);
            SoapObject response = (SoapObject) envelope.getResponse();

            if (response.hasProperty("LOGINKEY")) {
                if (response.getPropertyAsString("LOGINKEY") == null) {
                    object.setLoginKey(null);
                } else {
                    SoapObject token = (SoapObject) response.getProperty(0);
                    object.setLoginKey(token.getPropertyAsString(0));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return object;

[/code]

Aldığım hata mesajı : 

javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

175 Görüntülenme

1 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

picture-23778-1401789696.jpg
serifsadi88
12.03.2015 - 03:27

Pek güvenli olmayan bir yöntem ile probleme çözüm getirdim. DİKKAT ! Uygulamayı bu halde bırakmamak, geçici çözüm olarak kullanmak lazım.

ksoap2 kullanarak web service bağlantısı kullandığımız sınıfın en altına aşağıdaki kodu ekleyerek, uygulamaya "tüm SSL bağlantılarına güven" dedim.

[code]    

private static TrustManager[] trustManagers;

public static class _FakeX509TrustManager implements javax.net.ssl.X509TrustManager {
        private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[] {};

        public void checkClientTrusted(X509Certificate[] arg0, String arg1)
                throws CertificateException {
        }

        public void checkServerTrusted(X509Certificate[] arg0, String arg1)
                throws CertificateException {
        }

        public boolean isClientTrusted(X509Certificate[] chain) {
            return (true);
        }

        public boolean isServerTrusted(X509Certificate[] chain) {
            return (true);
        }

        public X509Certificate[] getAcceptedIssuers() {
            return (_AcceptedIssuers);
        }
    }

    public static void allowAllSSL() {

        javax.net.ssl.HttpsURLConnection
                .setDefaultHostnameVerifier(new HostnameVerifier() {
                    public boolean verify(String hostname, SSLSession session) {
                        return true;
                    }
                });

        javax.net.ssl.SSLContext context = null;

        if (trustManagers == null) {
            trustManagers = new javax.net.ssl.TrustManager[] { new _FakeX509TrustManager() };
        }

        try {
            context = javax.net.ssl.SSLContext.getInstance("TLS");
            context.init(null, trustManagers, new SecureRandom());
        } catch (NoSuchAlgorithmException e) {
            Log.e("allowAllSSL", e.toString());
        } catch (KeyManagementException e) {
            Log.e("allowAllSSL", e.toString());
        }
        javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(context
                .getSocketFactory());
    }[/code]

 

Daha sonra "allowAllSSL" metodunu "HttpTransportSE" oluşturmadan hemen önce çağırdım ve oluşturduğum "androidHttpTransport" değişkenini istediğim gibi kullandım.

        

[code]

allowAllSSL();

HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
androidHttpTransport.debug = true;

try {
     androidHttpTransport.call(SOAP_ACTION, envelope);
     SoapObject response = (SoapObject) envelope.getResponse();

     //.........

} catch (Exception e) {
            e.printStackTrace();
}[/code]