android - 带 HTTPS 的 KSOAP 2 Android

标签 android soap https ksoap2

我正在使用 KSOAP2 在 Android 中管理 SOAP,但它使用 https 作为 SOAP url,我收到此错误:javax.net.ssl.SSLException: Not trusted server certificate
一个正常的错误,因为证书不受信任,但是有人知道如何解决这个错误吗? 我无法管理该证书,因为它来自其他公司,而且我无权更改它。

谢谢

最佳答案

再次检查这个问题,我发现了一个更干净的解决方案。无需修改 KSOAP2 文件。

在您的项目中,链接ksoap2-android-assembly-3.0.0-jar,不做任何修改。

接下来,使用以下代码创建一个名为 SSLConnection.java 的文件:

package com.example.mypackage;

import android.util.Log;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

public class SSLConection {

    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 X509Certificate[] getAcceptedIssuers() {
            return (_AcceptedIssuers);
        }
    }

    public static void allowAllSSL() {

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

        javax.net.ssl.SSLContext context;

        if (trustManagers == null) {
            trustManagers = new TrustManager[]{new _FakeX509TrustManager()};
        }

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

并且只需在通过 KSOAP2 调用服务器方法之前调用 SSLConection.allowAllSSL();。这一切,为我工作。所有 SSL 证书都被接受,我可以将 KSOAP2 与 https 协议(protocol)一起使用。

关于android - 带 HTTPS 的 KSOAP 2 Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3440062/

相关文章:

java - 自动值示例 : error: cannot find symbol class AutoValue_Animal

java - 将数据传递给 Android 中的自定义 View

java - SOAP网络服务

tomcat - 在tomcat 8.5服务器上安装Godaddy ssl证书

ruby-on-rails - 如何仅在一页上使用 SSL?

android - 如何在 Android Firebase 数据库中为变量设置不同的名称?

android - 无法返回 View ,但只能在 onCreateView 方法( fragment )中返回 recyclerview

xml - 在 Oracle 中解析 SOAP XML

java - Soap 消息生成器返回字符串而不是发出请求

http - 默认通过https访问nginx上的站点