今天在与后台服务器调试时,因为使用了https,在Android 6.0以上的手机上面连接正常,在Android 6.0以下的手机出现了下面的异常,导致连接服务器失败:
com.android.volley.NoConnectionError: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
这是因为,在Android 6.0之后,Google 采用用BoringSSL 代替了OpenSSL ,所以导致6.0之前的系统和6.0之后的系统在使用https时出现了不一致的情况,经过网上资料查询之后,找到了一种靠谱的方案,虽然报错的信息不一样,但是原因是一样,亲测可用,分享给大家:
原文地址:
https://blog.csdn.net/rnzuozuo/article/details/52314617
我是使用了Volley,可以在进行StringRequest之前设置一个X509TrustManager。
首先新建一个类FakeX509TrustManager:
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
public class FakeX509TrustManager implements X509TrustManager {
private static TrustManager[] trustManagers;
private static final X509Certificate[] _AcceptedIssuers = new
X509Certificate[] {};
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) throws java.security.cert.CertificateException {
//To change body of implemented methods use File | Settings | File Templates.
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) throws java.security.cert.CertificateException {
//To change body of implemented methods use File | Settings | File Templates.
public boolean isClientTrusted(X509Certificate[] chain) {
return true;
public boolean isServerTrusted(X509Certificate[] chain) {
return true;
@Override
public X509Certificate[] getAcceptedIssuers() {
return _AcceptedIssuers;
public static void allowAllSSL() {
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String arg0, SSLSession arg1) {
// TODO Auto-generated method stub
return true;
SSLContext context = null;
if (trustManagers == null) {
trustManagers = new TrustManager[] { new FakeX509TrustManager() };
try {
context = SSLContext.getInstance("TLS");
context.init(null, trustManagers, new SecureRandom());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
然后在进行StringRequest之前设置:
FakeX509TrustManager.allowAllSSL();
mStringRequest = new StringRequest(Request.Method.POST,
getDefaultSuccessListener(),
mErrorListener){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return params;
mRequestQueue.add(mStringRequest);
再次运行则发现可以正常获取数据。
可以加一个判断,当android版本低于6.0的时候,才调用FakeX509TrustManager.allowAllSSL() 此方法。
今天在与后台服务器调试时,因为使用了https,在Android 6.0以上的手机上面连接正常,在Android 6.0以下的手机出现了下面的异常,导致连接服务器失败:com.android.volley.NoConnectionError: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorEx...
第一件事:定义一个RequestQueue。在实际开发中,这个对象应该写为一个
RequestQueue queue=
Volley
.newRequestQueue(this);
第二件事:定义一个Request
参数:请求类型(获取/上传)。网址/url。成功访问时的监听器。
失败
访问时的监听器。
StringRequest stringRequest = new StringRequest(int method, Listener<String> listener,@Nullable Er
Volley
是
Android
开源的一个框架,于2013年在Google大会上发布。
Volley
是一个Http库,它
Android
Apps执行网络操作更加方便,并且更加高效。在
Android
开源项目仓库中可以获得
Volley
源码:
clone
https
://
android
.googlesource.com/platform/framework
在本文中,我们将讨论SSL
连接
错误的原因及解决方法。在此之前,我们需要对SSL证书有所了解。SSL对发送到Web的信息进行编码,从而防止第三方窃听。在这种情况下,只有具有私钥的接收者才能解密通信。
1、
Android
设备上SSL
连接
错误的原因:
1)系统中的时间可能无效。这意味着
Android
时间和浏览器时间不匹配;
2)防火墙可能阻止了网站和IP地址;
3)cookie和缓存没有及时清除;
4)网站
服务器
上可能错误地安装了传输层安全性(TSL)和安全套接字层(SSL);
2、
Android
上的
Android
客户端和
服务器
端通常通过网络协议进行交互。常用的网络协议有 HTTP、
HTTPS
和 WebSockets。客户端可以通过发送 HTTP 请求来请求
服务器
端的数据,
服务器
端可以通过返回 HTTP 响应来响应客户端的请求。
为了方便
Android
客户端与
服务器
端的交互,开发人员可以
使用
一些网络库,比如 Retrofit、
Volley
和 OkHttp。这些库可以帮助开发人员简化网络请求的代码,并且提供了许多有用的功能,比如缓存、自动重试和请求优先级。
关于在华为手机上出现java.lang.SecurityException: Call from user 0 as user 132606 without permission的问题解决
fenglichenglin:
Flutter系列之设置TabBar的tab紧凑排列
碗吐撕瑞:
Android打包出现Out of memory: Java heap space的问题解决
sinat_34736910: