带 HTTPS 的 KSOAP 2 Android

新手上路,请多包涵

我正在使用 KSOAP2 在 Android 中管理 SOAP,但它使用 https 作为 SOAP url,我收到此错误:javax.net.ssl.SSLException: Not trusted server certificate

一个正常的错误,因为证书不受信任,但是有人知道如何解决这个错误吗?我无法管理该证书,因为它来自其他公司,而且我无权更改它。

谢谢

原文由 rallat 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 427
2 个回答

我还不能发表评论,所以我在这里发表我对 rallat answer 的评论。他的解决方案有效,但需要进一步解释。使用 ssl 运行 ksoap2:

  1. ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar 放入项目中

  2. https://github.com/mosabua/ksoap2-android/tree/(ksoap2 存储库)下载 ksoap2 源代码

  3. Copy HttpTransportSE.java , ServiceConnectionSE.java (I also needed to copy Transport.java , ServiceConnection.java and HeaderProperty.java ).从这些文件中删除导入并确保它们使用您的文件(而不是从 ksoap2.jar 导入)

  4. 使用 rallat 答案(我复制粘贴了它):

    • ServiceConnectionSE.java 添加这个接受不受信任的证书:
      private TrustManager[] trustAllCerts = new TrustManager[] {
         new X509TrustManager() {
             public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                 return null;
             }
             public void checkClientTrusted(
                 java.security.cert.X509Certificate[] certs, String authType) {
             }
             public void checkServerTrusted(
                 java.security.cert.X509Certificate[] certs, String authType) {
             }
         }
     };
    
    
    
    • 然后使用此构造函数允许不受信任的证书和未验证的主机名:
      public ServiceConnectionSE(String url) throws IOException {
         try {
             SSLContext sc = SSLContext.getInstance("TLS");
             sc.init(null, trustAllCerts, new java.security.SecureRandom());
             HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
         } catch (Exception e) {
             e.getMessage();
         }
         connection = (HttpsURLConnection) new URL(url).openConnection();
         ((HttpsURLConnection) connection).setHostnameVerifier(new AllowAllHostnameVerifier());
     }
    
    
    
    • 第二承建商
     public ServiceConnectionSE(Proxy proxy, String url) throws IOException {
         try {
             SSLContext sc = SSLContext.getInstance("TLS");
             sc.init(null, trustAllCerts, new java.security.SecureRandom());
             HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
          } catch (Exception e) {
             e.getMessage();
          }
          connection = (HttpsURLConnection) new URL(url).openConnection();
         ((HttpsURLConnection) connection).setHostnameVerifier(new AllowAllHostnameVerifier());
    
    
         connection.setUseCaches(false);
         connection.setDoOutput(true);
         connection.setDoInput(true);
     }
    
    
    
  5. 在您的代码中只需使用:

    HttpTransportSE aht = new HttpTransportSE(URL);
   aht.call(SOAP_ACTION, envelope);

教程中的其他内容

原文由 zirael 发布,翻译遵循 CC BY-SA 3.0 许可协议

再次检查这个问题,我发现了一个更干净的解决方案。无需修改 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 协议一起使用。

原文由 Neonigma 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏