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

接着上面的说

一.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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值