您的位置:首页 > 理论基础 > 计算机网络

Android支持https的处理方式3---webview支持https 双向认证

2016-11-25 17:40 477 查看
接着上面的说

一.android 4.0(不包含)以下版本的实现方法:

1、读取初始化证书:

private SSLContext createSSLContext() {
SSLContext localSSLContext = null;
try {
// 创建一个证书库,并将证书导入证书库
KeyStore keyStore = KeyStore.getInstance("PKCS12", "BC");
keyStore.load(
mContext.getResources().openRawResource(R.raw.client),//client 是*.pfx文件
CERTFILE_PASSWORD.toCharArray());//CERTFILE_PASSWORD 为你的证书的密码
KeyManagerFactory localKeyManagerFactory = KeyManagerFactory
.getInstance(KeyManagerFactory.getDefaultAlgorithm());
localKeyManagerFactory.init(keyStore,
CERTFILE_PASSWORD.toCharArray());
KeyManager[] arrayOfKeyManager = localKeyManagerFactory
.getKeyManagers();
localSSLContext = SSLContext.getInstance("TLS");
localSSLContext.init(arrayOfKeyManager, trustAllCerts,
new SecureRandom());
} catch (Exception ex) {
ex.printStackTrace();
}
return localSSLContext;
}
2、认证:

public boolean setWebViewSSLCert() {
boolean issuc = false;// true 代表验证和设置成功
if (Build.VERSION.SDK_INT >= 14){
return issuc;
}

try {
Field[] arrayOfField = Class.forName(
"android.net.http.HttpsConnection").getDeclaredFields();
for (Field localField : arrayOfField) {
if (localField.getName().equals("mSslSocketFactory")) {//采用反射的方式修改mSslSocketFactory变量
localField.setAccessible(true);
localField.set(null,createSSLContext().getSocketFactory());
issuc = true;
break;
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
return issuc;
}

3、webview需要https认证的时候调用setWebViewSSLCert方法即可
二、android 4.0(包含)以上版本的实现方法:

1、书写认证:

private X509Certificate[] mX509Certificates;
private PrivateKey mPrivateKey;
private void initPrivateKeyAndX509Certificate()
throws Exception {
KeyStore keyStore;
// 创建一个证书库,并将证书导入证书库
KeyStore keyStore = KeyStore.getInstance("PKCS12", "BC");
keyStore.load(
mContext.getResources().openRawResource(R.raw.client),
CERTFILE_PASSWORD.toCharArray());

localEnumeration = keyStore.aliases();
while (localEnumeration.hasMoreElements()) {
String str3 = (String) localEnumeration.nextElement();
mPrivateKey = (PrivateKey) keyStore.getKey(str3,
CERTFILE_PASSWORD.toCharArray());
if (mPrivateKey == null) {
continue;
} else {
Certificate[] arrayOfCertificate = keyStore
.getCertificateChain(str3);
mX509Certificates = new X509Certificate[arrayOfCertificate.length];
for (int j = 0; j < mX509Certificates.length; j++) {
mX509Certificates[j] = ((X509Certificate) arrayOfCertificate[j]);
}
}
}
}

public class BasicWebViewClientEx extends WebViewClient {
private X509Certificate[] certificatesChain;
private PrivateKey clientCertPrivateKey;

public BasicWebViewClientEx(AbstractActivity activity) {
mActivity = activity;
certificatesChain = getX509Certificates();//此处就是上文中的mX509Certificates
clientCertPrivateKey = getPrivateKey();//次处就是上文中的mPrivateKey
}

public void onReceivedClientCertRequest(WebView view,
ClientCertRequestHandler handler, String host_and_port) {
//注意该方法是调用的隐藏函数接口。这儿是整个验证的技术难点:就是如何调用隐藏类的接口。
//方法:去下载一个android4.2版本全编译后的class.jar 然后导入到工程中
if((null != clientCertPrivateKey) && ((null!=certificatesChain) && (certificatesChain.length !=0))){
handler.proceed(this.clientCertPrivateKey, this.certificatesChain);
}else{
handler.cancel();
}
}

@Override
public void onReceivedSslError(final WebView view, SslErrorHandler handler,
SslError error) {
handler.proceed();
}

} 2、调用
mWebView.setWebViewClient(new

BasicWebViewClientEx());



感谢原作者:http://blog.sina.com.cn/s/blog_618199e60101tgvk.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  webview https android 认证