上一篇介绍接口使用https并且证书是自签的情况下,如何在客户端信任服务器证书,没有看过的请移步
1.Webview加载https问题
1.1 最简单的方式,助各位大佬一秒脱坑
自定义证书的https地址在加载时会进入
onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) 方法,前提是自定义webviewClient类。这时候调用 handler.proceed()即可。也就是忽略验证证书这个过程。
这个方式简单,快捷,但是可能会过不了大厂的安全监测,handler.proceed()这个方法会被监测到,视为https安全检测(本人就是被卡在这里,哭),另外在上架google应用时也会因此被拒,提示使用handler.cancel()方法,但是没有实际作用,因为会加载不出来。
1.2 安全的方式
安全的方式当然是让webview信任服务器证书了。
首先把证书放入项目中
za.cer https证书
private void handlerCer(final SslErrorHandler ssl, String url) {
OkHttpClient.Builder builder;
try {
builder = setCertificates1(new OkHttpClient.Builder(), context.getAssets().open("zs.cer"));
//builder=checkAction(new OkHttpClient.Builder());
}catch (Exception e) {
builder =new OkHttpClient.Builder();
}
builder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
//忽略域名检查
return true;
}
});
Request request =new Request.Builder().url(url).build();
builder.build().newCall(request).enqueue(new okhttp3.Callback() {
@Override
public void onFailure(okhttp3.Call call, IOException e) {
ssl.cancel();
}
@Override
public void onResponse(okhttp3.Call call, okhttp3.Response response)throws IOException {
ssl.proceed();
}
});
}
private OkHttpClient.Builder setCertificates(OkHttpClient.Builder client, InputStream... certificates) {
try {
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
// KeyStore keyStore = KeyStore.getInstance("PKCS12", "BC");
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null);
int index = 0;
for (InputStream certificate : certificates) {
String certificateAlias = Integer.toString(index++);
keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(certificate));
try {
if (certificate != null)
certificate.close();
} catch (IOException e) {
}
}
SSLContext sslContext = SSLContext.getInstance("TLS");
TrustManagerFactory trustManagerFactory =
TrustManagerFactory.getInstance(Tr