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




ssl https (3)

मैं 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;
}

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

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

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 / यूआरएल]


ठीक है, 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 एसई प्रोजेक्ट में डालकर उनका उपयोग करें। यह मेरे लिए काम किया है और यह एक अज्ञात और काफी जटिल वेब सेवा के साथ पहले कदम सही पाने के लिए एक उत्पादकता में सुधार हो गया।








android-ksoap2