我正在使用 KSOAP2 在 Android 中管理 SOAP,但它使用 https 作为 SOAP url,我收到此错误:javax.net.ssl.SSLException: Not trusted server certificate
一个正常的错误,因为证书不受信任,但是有人知道如何解决这个错误吗?我无法管理该证书,因为它来自其他公司,而且我无权更改它。
谢谢
原文由 rallat 发布,翻译遵循 CC BY-SA 4.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 许可协议
3 回答958 阅读✓ 已解决
2 回答1k 阅读✓ 已解决
1 回答837 阅读✓ 已解决
2 回答946 阅读
2 回答886 阅读
1 回答820 阅读
2 回答689 阅读
我还不能发表评论,所以我在这里发表我对 rallat answer 的评论。他的解决方案有效,但需要进一步解释。使用 ssl 运行 ksoap2:
将
ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar
放入项目中从 https://github.com/mosabua/ksoap2-android/tree/(ksoap2 存储库)下载 ksoap2 源代码
Copy
HttpTransportSE.java
,ServiceConnectionSE.java
(I also needed to copyTransport.java
,ServiceConnection.java
andHeaderProperty.java
).从这些文件中删除导入并确保它们使用您的文件(而不是从ksoap2.jar
导入)使用 rallat 答案(我复制粘贴了它):
ServiceConnectionSE.java
添加这个接受不受信任的证书:在您的代码中只需使用:
教程中的其他内容