在我的一个应用程序中,我使用带有自签名证书的HTTPS,并按照Android开发人员培训网站(https://developer.android.com/training/articles/security-ssl.html#UnknownCa)中的示例代码进行操作.
我最近得到了以下警报,说当前的实施不安全:
安全警报
您的应用程序正在使用与Apache HTTP客户端的X509TrustManager接口的不安全实现,从而导致安全漏洞.有关详细信息,请参阅此Google帮助中心文章,其中包括修复漏洞的截止日期.
有人可以提供更多详细信息,除了上面链接的示例代码之外应该更新什么?
我应该实现自定义TrustManager吗?如果是这样,它应该验证什么?
谷歌已经建议我在我的Android应用程序中有一个不安全的接口X509TrustManager实现,需要更改我的代码如下:
要正确处理SSL证书验证,请在自定义X509TrustManager接口的checkServerTrusted方法中更改代码,以便在服务器提供的证书不符合您的期望时引发CertificateException或IllegalArgumentException.对于技术问题,您可以发布到Stack Overflow并使用标签"android-security"和"TrustManager".
如何修改以下代码以解决上述问题?
public EasySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
super(truststore);
TrustManager tm = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
mContext.init(null, new TrustManager[] { tm }, null);
}
Run Code Online (Sandbox Code Playgroud) 在提出问题之前,我找到了一些链接,我逐一检查了这些链接,但没有一个链接给我一个解决方案:
我到目前为止唯一找到的链接是这一个,它提供了两种方法:使用Android Volley发出HTTPS请求
我也找到了这个博客,其中有很多解释,但最后,我意识到这些例子都使用了来自"apache.org"的弃用库,而博客本身也没有Android Volley的内容.
https://nelenkov.blogspot.mx/2011/12/using-custom-certificate-trust-store-on.html
还有来自Android的链接和"未知证书颁发机构"部分的代码,它给出了解决方案的一个好主意,但代码本身在其结构中缺少一些东西(Android Studio抱怨...):https:// developer.android.com/training/articles/security-ssl.html
但是这个链接的引用似乎是解决问题的核心概念.
"TrustManager是系统用于验证来自服务器的证书的方法,并且通过从具有一个或多个CA的KeyStore创建一个证书 - 那些将是该TrustManager信任的唯一CA.给定新的TrustManager,该示例初始化一个新的SSLContext它提供了一个SSLSocketFactory,您可以使用它来覆盖HttpsURLConnection的默认SSLSocketFactory.这样连接将使用您的CA进行证书验证."
现在,这是我的问题:我有一个使用自签名证书的网络服务器,我根据其证书创建了一个"BKS信任库".我已将de BKS信任库导入我的Android APP,现在,我的应用程序上有以下代码(我刚刚在这里发布了MainActivity,这是迄今为止唯一与此主题相关的类,我想):
package com.domain.myapp;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.HurlStack;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import java.io.InputStream;
import java.security.KeyStore;
import java.util.HashMap;
import java.util.Map;
import javax.net.ssl.SSLContext; …Run Code Online (Sandbox Code Playgroud) 我在Google Play上有一个应用程序,今天我收到了Google的一封邮件说:
Google Play警告:您正在使用X509TrustManager的不安全实施
它说明了SSL证书问题以及解决问题的方法.
因为好奇,我问这个问题,
更多细节:
我的应用程序是使用Appcelerator Titanium构建的,google说这个实现是在ti.modules.titanium.network.NonValidatingTrustManager;.我确信我的代码中从未使用过这样的类.
android appcelerator android-security appcelerator-titanium trustmanager
com.android.volley.NoConnectionError: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
Run Code Online (Sandbox Code Playgroud)
我在 19 到 24 的 api 上的 logcat 中收到此错误,并且我的应用程序中没有从服务器加载数据我搜索了该错误并找到了解决方案
@SuppressLint("TrulyRandom")
public static void handleSSLHandshake() {
try {
TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
@Override
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
@Override
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
}};
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String arg0, SSLSession …Run Code Online (Sandbox Code Playgroud) android android-volley android-security trustmanager x509trustmanager
我在谷歌播放应用程序,我收到了谷歌的一封邮件说:
您在此电子邮件末尾列出的应用使用了界面X509TrustManager的不安全实现.具体而言,在与远程主机建立HTTPS连接时,实现会忽略所有SSL证书验证错误,从而使您的应用容易受到中间人攻击.
要正确处理SSL证书验证,请在自定义X509TrustManager接口的checkServerTrusted方法中更改代码,以便在服务器提供的证书不符合您的期望时引发CertificateException或IllegalArgumentException.
我的应用使用"https",我checkServerTrusted()的内容如下:
TrustManager tm = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
Run Code Online (Sandbox Code Playgroud)
然后我修改这个功能:
TrustManager tm = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
if (chain == null) {
throw new IllegalArgumentException("checkServerTrusted: X509Certificate array is null");
}
if …Run Code Online (Sandbox Code Playgroud) 首先,我应该说,我主要是一名PHP开发人员.我在Google Play上有一个相对老旧的应用程序,该应用程序是在2012年底针对API 15构建的.
在此处查看了其他与Google Play界面X509TrustManager警报的不安全实施相关的问题,但似乎没有一个适用于我.我不是通过SSL提出请求,也不是在Google Play服务之外使用任何外部库.
警报说问题是apache.http.具体来说它说:
您的应用程序正在使用与Apache HTTP客户端的X509TrustManager接口的不安全实现,从而导致安全漏洞.有关详细信息,请参阅此Google帮助中心文章,其中包括修复漏洞的截止日期.
由于我没有使用SSL连接,我不知道如何继续.事实上我没有使用SSL来解决Google遇到的问题吗?我与服务器交换的数据实际上不能被视为敏感 - 丢失并找到宠物列表.
该应用程序所涉及的网站是自愿的,自筹资金的,并且在共享主机上,因此添加SSL是我不希望在此时被强制使用的内容.实施SSL是我唯一的前进方向吗?
我正在使用Robolectric 4.3.1( testImplementation "org.robolectric:robolectric:4.3.1") 为我的集成测试创建一个 Android sqlite 环境。我的系统使用OkHttp( implementation 'com.squareup.okhttp3:okhttp:3.14.7') 来处理真实的 HTTP 请求。我不使用MockWebServer.
升级到 Android 10 SDK 后,我必须根据 Robolectric 说明将单元测试 JVM 更新到 JDK 9 :
在 Android API 29 上运行测试现在严格要求 Java9 运行时或更新版本。如果您在通过 Android Studio 在 API 29 上运行测试时看到有关不受支持的 Java 版本的错误;您可以使用“运行配置”对话框中的“JRE”字段来配置更新的 Java 运行时。有关更多背景信息,请参阅https://developer.android.com/studio/run/rundebugconfig。
但是,现在我的集成测试失败了:
java.lang.NullPointerException: No password supplied for PKCS#12 KeyStore.
at org.bouncycastle.jcajce.provider.keystore.pkcs12.PKCS12KeyStoreSpi.engineLoad(Unknown Source)
at java.base/java.security.KeyStore.load(KeyStore.java:1479)
at java.base/sun.security.ssl.TrustStoreManager$TrustAnchorManager.loadKeyStore(TrustStoreManager.java:367)
at java.base/sun.security.ssl.TrustStoreManager$TrustAnchorManager.getTrustedCerts(TrustStoreManager.java:315)
at java.base/sun.security.ssl.TrustStoreManager.getTrustedCerts(TrustStoreManager.java:59)
at java.base/sun.security.ssl.TrustManagerFactoryImpl.engineInit(TrustManagerFactoryImpl.java:51)
at java.base/javax.net.ssl.TrustManagerFactory.init(TrustManagerFactory.java:278)
at okhttp3.internal.Util.platformTrustManager(Util.java:640)
at …Run Code Online (Sandbox Code Playgroud) 任何人都可以帮忙解决这个问题吗?
我还使用OKHTTP3 版本 4.8.1编写HTTP2 客户端。它可以在 Oracle JDK 8 上运行,但不能在 IBM JRE 8 上运行。
错误消息:java.lang.IllegalStateException:无法在 okhttp3.internal.Platform@e85a0ce8 上提取信任管理器,sslSocketFactory 是类 com.ibm.jsse2.SSLSocketFactoryImpl。
谢谢
trustmanager ×9
android ×7
okhttp ×2
ssl ×2
appcelerator ×1
https ×1
ibm-jre ×1
java ×1
jsse ×1
robolectric ×1
security ×1