android web认证失败,webview.loadUrl()中的Android错误 - 未找到认证路径的信任锚点...

我正在处理这个问题,并坦率地允许MITM攻击是一个邻没有。这是一个支持固定的更清洁的解决方案。将证书保存到您的原始资源文件夹中。

注意:可悲的是,当您调用getCertificate()时,SSLError会给我们一个SslCertificate。 SslCertificate是没用的。它的公开API不允许你验证公钥,只有创建日期,发布日期,发布时间等。但是,如果您打开此类,则会看到未公开的X509Certificate成员变量。 IDK为什么做出这个设计决定。但是有一个获取Bundle的API,并且X509 Certificate成员变量被存储在那里。所以我们以这种方式访问​​它,因为证书有更多有用的方法。

@Override

public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {

SslCertificate sslCertificateServer = error.getCertificate();

Certificate pinnedCert = getCertificateForRawResource(R.raw.your_cert, mContext);

Certificate serverCert = convertSSLCertificateToCertificate(sslCertificateServer);

if(pinnedCert.equals(serverCert)) {

handler.proceed();

} else {

super.onReceivedSslError(view, handler, error);

}

}

public static Certificate getCertificateForRawResource(int resourceId, Context context) {

CertificateFactory cf = null;

Certificate ca = null;

Resources resources = context.getResources();

InputStream caInput = resources.openRawResource(resourceId);

try {

cf = CertificateFactory.getInstance("X.509");

ca = cf.generateCertificate(caInput);

} catch (CertificateException e) {

Log.e(TAG, "exception", e);

} finally {

try {

caInput.close();

} catch (IOException e) {

Log.e(TAG, "exception", e);

}

}

return ca;

}

public static Certificate convertSSLCertificateToCertificate(SslCertificate sslCertificate) {

CertificateFactory cf = null;

Certificate certificate = null;

Bundle bundle = sslCertificate.saveState(sslCertificate);

byte[] bytes = bundle.getByteArray("x509-certificate");

if (bytes != null) {

try {

CertificateFactory certFactory = CertificateFactory.getInstance("X.509");

Certificate cert = certFactory.generateCertificate(new ByteArrayInputStream(bytes));

certificate = cert;

} catch (CertificateException e) {

Log.e(TAG, "exception", e);

}

}

return certificate;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值