Ksoap2-android का उपयोग करके विश्वसनीय प्रमाणपत्र नहीं है




ssl https (4)

हां, शायद आप इसे बाहर की कोशिश कर सकते हैं

एचटीपीएस कनेक्शन एंड्रॉइड

इस बारे में इश्यू ट्रैकर पर एक बग दर्ज किया गया है

http://code.google.com/p/android/issues/detail?id=2388

मैं SSL पर WCF सेवा को कॉल करने के लिए ksoap2-android का उपयोग कर रहा हूं। मैं एसएसएल के बिना काम कर सकता हूं, लेकिन अब मैं SSL पर कॉल करना चाहता हूं, लेकिन मैंने कुछ समस्याओं में भाग लिया है।

मैं HttpTransportSE के बजाय HttpsTransportSE का उपयोग कर रहा हूं, लेकिन मुझे त्रुटि मिल रही है: javax.net.ssl.SSLException: विश्वसनीय सर्वर प्रमाणपत्र नहीं है

मैं इसे कैसे ठीक करूं?

क्या मैं समस्या का समाधान करने के लिए एंड्रॉइड में कीस्ट्रॉयर में सर्वर प्रमाणपत्र को जोड़ सकता हूं?

private static final String SOAP_ACTION = "http://example.com/Service/GetInformation";
private static final String METHOD_NAME = "GetInformation";
private static final String NAMESPACE = "http://example.com";    
private static final String URL = "dev.example.com/Service.svc";

public static Result GetInformation()
{
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

    PropertyInfo property = new PropertyInfo();
    property.name = "request";

    Request request =
        new Request("12", "13", "Ben");

    userInformationProperty.setValue(request);
    userInformationProperty.setType(request.getClass());
    request.addProperty(property);

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = true;
    envelope.setOutputSoapObject(request);
    envelope.addMapping(NAMESPACE, "Request",new Request().getClass());

    HttpsTransportSE transport = new HttpsTransportSE(URL, 443, "", 1000);

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

    try
    {
        transport.call(SOAP_ACTION, envelope);          
        return Result.FromSoapResponse((SoapObject)envelope.getResponse());
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
    catch (XmlPullParserException e)
    {
        e.printStackTrace();
    }

    return null;
}

मेरे लिए KSOAP + वेब सेवा डब्लूसीएफ एक्लिप्स के साथ काम करता है

private static SoapObject getBody(final SoapSerializationEnvelope soapEnvelope) throws Exception {
        if (soapEnvelope.bodyIn == null) {
            throw new Exception("soapEnvelope.bodyIn=null");
        }
        else if (soapEnvelope.bodyIn.getClass() == SoapFault.class) {
            throw new ExceptionLogic((SoapFault) soapEnvelope.bodyIn));
        }
        else {
            return (SoapObject) soapEnvelope.bodyIn;
        }

    }

private static SoapSerializationEnvelope sendRequete(final SoapObject soapReq, final String classMappingName,
            final Class<?> classMapping, final int timeOutSpecial) {



        final SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        soapEnvelope.implicitTypes = true;
        soapEnvelope.dotNet = true;

        if (classMappingName != null) {
            soapEnvelope.addMapping(NAMESPACE, classMappingName, classMapping);
        }

        soapEnvelope.setOutputSoapObject(soapReq);

        try {

            final HttpTransportSE httpTransport = new HttpTransportSE(Constante.urlWebService, timeOutSpecial);
            httpTransport.debug = BuildConfig.DEBUG;

            // Prod
            if (Constante.urlWebService.startsWith("https://")) {
                final List<HeaderProperty> headerList = new ArrayList<HeaderProperty>();
                headerList.add(new HeaderProperty("Authorization", "Basic "
                        + org.kobjects.base64.Base64.encode((Constante.CERTIFICAT_LOGIN + ":" + Constante.CERTIFICAT_MDP).getBytes())));

                FakeX509TrustManager.allowAllSSL();
                httpTransport.call(NAMESPACE + "/" + soapReq.getName(), soapEnvelope, headerList);
            }
            // Test
            else {
                httpTransport.call(NAMESPACE + "/" + soapReq.getName(), soapEnvelope);
            }

            return soapEnvelope;
        }
        catch (final Exception e) {
            throw new Exception("Erreur : " + e.getMessage(), e);
        }

    }



    private static class FakeX509TrustManager implements X509TrustManager {
        private static TrustManager[] trustManagers;
        private final X509Certificate[] _AcceptedIssuers = new X509Certificate[] {};

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

        public static void allowAllSSL() {
            HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {

                @Override
                public boolean verify(final String hostname, final SSLSession session) {
                    return true;
                }
            });
            SSLContext context = null;
            if (trustManagers == null) {
                trustManagers = new TrustManager[] { new FakeX509TrustManager() };
            }
            try {
                context = SSLContext.getInstance("TLS");
                context.init(null, trustManagers, new SecureRandom());
            }
            catch (final NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
            catch (final KeyManagementException e) {
                e.printStackTrace();
            }
            HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
        }

        @Override
        public void checkClientTrusted(final X509Certificate[] arg0, final String arg1) throws CertificateException {

        }

        @Override
        public void checkServerTrusted(final X509Certificate[] chain, final String authType) throws CertificateException {

        }
    }

ठीक है, HttpsServiceConnectionSE को संशोधित करने के बजाय ऐसा करने का एक आसान तरीका है आप http://groups.google.com/group/android-developers/browse_thread/thread/1ac2b851e07269ba/c7275f3b28ad8bbc?lnk=gst&q=certificate में बताए अनुसार किसी नकली ट्रस्ट मैनेजर को स्थापित कर सकते हैं और फिर किसी भी एसएसएल से पहले आपको कॉलसएल्एसएसएल () को कॉल करें संचार / ksoap2 को कॉल करें यह एक नया डिफ़ॉल्ट होस्टनाम सत्यापन और ट्रस्टमैनेजर पंजीकृत करेगा। ksoap2, अपने एसएसएल संचार करते समय, डिफ़ॉल्ट लोगों का उपयोग करेगा और यह एक जादू की तरह काम करता है

आप इसमें कुछ और प्रयास भी डाल सकते हैं, इसे (अधिक) सुरक्षित बना सकते हैं, और एक आवेदन स्थानीय ट्रस्ट मैनेजर में प्रमाणपत्र इंस्टॉल कर सकते हैं, मुझे लगता है मैं एक सुरक्षित नेटवर्क में था और मैन-इन-द-मध्य आक्रमणों से नहीं डरता, इसलिए मैंने पहले किया।

मुझे यह KeepAliveHttpsTransportSE का उपयोग करने के लिए इस new KeepAliveHttpsTransportSE(host, port, file, timeout); । पैरामीटर यूआरएल ऑब्जेक्ट में जाते हैं, उदाहरण के लिए, एक जीरा इंस्टॉलेशन तक पहुंचने के लिए, यह new KeepAliveHttpsTransportSE("host.whatever", 443, "/rpc/soap/jirasoapservice-v2", 1000) जैसी कुछ है।

कभी-कभी इसका आसान यदि आप तकनीक या वेब सेवा के लिए नए हैं, तो आप इम्यूलेटर के बजाय या डिवाइस पर इसके बजाय एक J2SE परिवेश में इसके साथ खेलने के लिए उपयोग करना चाहते हैं, लेकिन J2SE / ME ksoap2 लाइब्रेरी में (KeepAlive) HttpsTransportSE सामान अनुपलब्ध है (मैं ksoap2-j2se-full-2.1.2.jar उपयोग किया है)। आप क्या कर सकते हैं, तीन कक्षाओं के लिए स्रोत प्राप्त करना है एचटीपीटी ट्रांस्पोर्टएसई, KeepAliveHttpsTransportSE और HttpsServiceConnectionSE एंड्रॉइड स्पिन-ऑफ केएसएपी 2-एंड्रॉइड से और उन्हें अपने जे 2 एसई प्रोजेक्ट में डालकर उनका उपयोग करें। यह मेरे लिए काम किया है और यह एक अज्ञात और काफी जटिल वेब सेवा के साथ पहले कदम सही पाने के लिए एक उत्पादकता में सुधार हो गया।


कुछ स्रोत कोड के साथ वेदरेन का उत्तर देने के लिए, माफ करना, मैं टिप्पणी नहीं कर सकता।

ट्रस्ट प्रबंधक:

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());
}

अपनी पद्धति पर कॉल:

allowAllSSL();
HttpsTransportSE httpsTransport = new HttpsTransportSE(Server,443, URL, 1000);

टिप्पणियाँ:

  1. सर्वर सर्वर यूआरएल है
  2. 443 डिफ़ॉल्ट https पोर्ट है, आपको अब भी पोर्ट निर्दिष्ट करना होगा क्योंकि निर्माता को उम्मीद है कि एक
  3. यूआरएल डब्ल्यूएस ऑपरेशन के लिए पथ
  4. 1000 एस टाइमआउट

किसको बनाया गया है: [https: // सर्वर: 443 / यूआरएल]







android-ksoap2