免费试用

中文化、本土化、云端化的在线跨平台软件开发工具,支持APP、电脑端、小程序、IOS免签等等

androidwebview证书认证失败

Android WebView是Android提供的一个组件,用于在应用中显示网页内容。其内部使用了WebKit引擎来解析和渲染网页。在使用WebView加载HTTPS网页时,可能会遇到证书认证失败的情况,本文将对此问题进行原理解析和详细介绍。

一、HTTPS和证书认证简介

HTTPS是HTTP的安全版本,通过使用SSL/TLS协议对通信内容进行加密,保证数据传输的安全性。证书认证是HTTPS协议中常用的一种安全机制,用于验证服务器的身份。当客户端发起HTTPS请求时,服务器会返回一个证书,证书中包含了服务器的公钥和其他相关信息。客户端根据证书中的公钥验证服务器的身份,并使用该公钥进行加密通信。

二、证书认证失败的原因

1. 证书过期:证书通常都有一个有效期限,当证书过期后,浏览器将不再信任该证书。

2. 证书颁发者不受信任:浏览器内置了一些受信任的证书颁发机构(CA),只有由这些CA颁发的证书才被认为是可信任的。

3. 主机名不匹配:证书中会包含服务器的主机名信息,浏览器会检查证书中的主机名和实际访问的主机名是否匹配,如果不匹配则认为是不安全的。

三、Android WebView中的证书认证机制

Android WebView对证书认证有自己的默认行为,根据不同的情况采取不同的策略。

1. 默认行为:如果证书过期或由不受信任的颁发机构颁发,则WebView将抛出SSLException,停止加载网页。

2. 信任所有证书:可以通过设置WebView的WebSettings属性来信任所有证书,不进行证书认证。这种方式会造成安全风险,不建议使用。

```java

webSettings.setAcceptThirdPartyCookies(false);

webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);

webView.setWebViewClient(new WebViewClient() {

@Override

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

handler.proceed();

}

});

```

3. 自定义证书认证:可以通过自定义WebViewClient的方式来处理证书认证,实现自己的逻辑。

```java

webView.setWebViewClient(new WebViewClient() {

@Override

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

// 自定义证书认证逻辑,比如检查证书是否过期、是否受信任等

// 最后根据判断结果调用 handler.proceed() 或 handler.cancel(),决定是否允许加载网页

}

});

```

四、自定义证书认证的实现

自定义证书认证通常需要用到Android中的X509TrustManager接口和SSLSocketFactory类。

1. 创建自定义的X509TrustManager:

```java

public class CustomTrustManager implements X509TrustManager {

@Override

public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {

// 客户端证书认证逻辑,可以留空

}

@Override

public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {

// 服务器证书认证逻辑

for (X509Certificate certificate : chain) {

// 检查证书是否过期、是否受信任等

// 如果认证失败,可以抛出 CertificateException 异常

}

}

@Override

public X509Certificate[] getAcceptedIssuers() {

return new X509Certificate[0];

}

}

```

2. 创建自定义的SSLSocketFactory:

```java

public class CustomSSLSocketFactory extends SSLSocketFactory {

private SSLSocketFactory delegate;

public CustomSSLSocketFactory() throws KeyManagementException, NoSuchAlgorithmException {

SSLContext sslContext = SSLContext.getInstance("TLS");

sslContext.init(null, new TrustManager[]{new CustomTrustManager()}, new SecureRandom());

delegate = sslContext.getSocketFactory();

}

@Override

public String[] getDefaultCipherSuites() {

return delegate.getDefaultCipherSuites();

}

@Override

public String[] getSupportedCipherSuites() {

return delegate.getSupportedCipherSuites();

}

@Override

public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException {

return delegate.createSocket(socket, host, port, autoClose);

}

@Override

public Socket createSocket(String host, int port) throws IOException {

return delegate.createSocket(host, port);

}

@Override

public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException {

return delegate.createSocket(host, port, localHost, localPort);

}

@Override

public Socket createSocket(InetAddress host, int port) throws IOException {

return delegate.createSocket(host, port);

}

@Override

public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {

return delegate.createSocket(address, port, localAddress, localPort);

}

}

```

3. 在自定义的WebViewClient中使用自定义的SSLSocketFactory:

```java

webView.setWebViewClient(new WebViewClient() {

@Override

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

try {

SSLContext sslContext = SSLContext.getInstance("TLS");

sslContext.init(null, new TrustManager[]{new CustomTrustManager()}, new SecureRandom());

SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

handler.proceed();

view.setWebViewClient(new WebViewClient() {

@Override

public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {

return new WebResourceResponse(null, null, null);

}

});

} catch (NoSuchAlgorithmException | KeyManagementException e) {

e.printStackTrace();

}

}

});

```

通过自定义证书认证机制,我们可以自由地处理证书认证失败的情况,实现更加灵活的WebView加载行为。但是需要注意,自定义的证书认证逻辑要确保安全性,避免造成风险。

参考文献:

1. https://developer.android.com/guide/webapps/webview

2. https://developer.android.com/reference/android/net/http/SslError


相关知识:
苹果软件改签名
苹果软件改签名是指通过更改软件的数字签名来修改软件的信息、权限或者来源。在苹果设备上运行的应用程序都必须经过苹果的数字签名认证,确保应用程序的来源可信和完整性。因此,改签名需要对应用程序进行解签和重新签名的操作。以下是苹果软件改签名的详细介绍:步骤一:解析
2023-07-20
不得不了解的苹果企业签名
苹果企业签名是指在苹果设备上安装、分发、使用自定义企业级应用程序的一种机制。它允许企业或开发者将其自有的应用程序通过特定的认证方式签署,然后分发给公司内部员工或特定授权的用户。相比于在App Store上发布应用,苹果企业签名提供了更多灵活性和自主性,适用
2023-07-20
pfx与p12证书各是什么
PFX(Personal Information Exchange)和P12(PKCS#12)证书是用于加密和安全传输数据的常见格式。它们通常用于存储和传输数字证书、私钥和相关信息。PFX和P12是基于PKCS#12标准的证书格式,PKCS(Public
2023-07-18
安卓签名是什么样的
安卓签名是指对安卓应用程序进行数字签名,以确保应用程序的完整性和安全性。安卓签名使用的是公钥加密和数字证书技术,通过在应用程序上附加数字签名,可以验证应用程序是否经过篡改或未经授权的修改。安卓系统要求每个应用程序都必须经过数字签名,以验证应用程序的来源和完
2023-07-17
安卓代码签名证书
安卓应用的代码签名证书是保证应用的安全性和完整性的重要组成部分。签名证书用于验证应用的开发者身份,确保应用没有被篡改或被恶意修改。本文将详细介绍安卓代码签名证书的原理和使用方法。一、代码签名的原理在安卓系统中,每个应用都有一个唯一的包名和数字签名证书。开发
2023-07-17
apktool免费签名
APKTool 是一个能够解包和重新打包 Android APK 文件的开源工具。它提供了反编译、修改以及重新打包 APK 文件的功能,是 Android 应用逆向工程和定制化开发的重要工具之一。然而,由于 Android 应用签名是保证应用完整性和安全性
2023-07-17
©2015-2021 成都七扇门科技有限公司 yimenapp.com  川公网安备 51019002001185号 蜀ICP备17005078号-4