在webview组件上选择certificate ssl

时间:2017-07-25 05:58:21

标签: android ssl webview ssl-certificate

在打开页面以从存储中建立的选择所需的SSL证书(自签名)时,我找不到如何强制组件的方法。

在创建活动期间:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_form1);
        //настраиваем браузер
        mbrowser = (WebView) findViewById(R.id.webview);
        mbrowser.getSettings().setJavaScriptEnabled(true);
        mbrowser.getSettings().setJavaScriptEnabled(true);
        mbrowser.getSettings().setAppCacheEnabled(true);
        mbrowser.getSettings().setDatabaseEnabled(true);
        mbrowser.getSettings().setDomStorageEnabled(true);
        mbrowser.getSettings().setSupportZoom(true);
        mbrowser.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        mbrowser.getSettings().setBuiltInZoomControls(true);
        CookieManager.getInstance().setAcceptCookie(true);
        //web resource on self-signed certificate
        mbrowser.loadUrl("https://blabla.com");
        mbrowser.setWebViewClient(new NocWebViewClient());
    }
    
    private class NocWebViewClient extends WebViewClient {
    @Override
    public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
       handler.proceed();
    }
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url)
    {
        return true;
    }
    @Override
    public void onPageFinished(WebView view, String url){

    }
}

据我所知,onReceivedSslError或OnReceivedClientCertRequest需要添加更改证书,就像在普通浏览器中一样:

浏览器中的图片如下所示

enter image description here

这里只是为了制作它?

1 个答案:

答案 0 :(得分:1)

private class NocWebViewClient extends WebViewClient {
    @Override
    public void onReceivedClientCertRequest(WebView view, final ClientCertRequest request) {       
        KeyChain.choosePrivateKeyAlias(Form1.this, new KeyChainAliasCallback(){
            @TargetApi(Build.VERSION_CODES.LOLLIPOP)
            @Override
            public void alias(String alias) {                
                try {
                    PrivateKey changPrivateKey = KeyChain.getPrivateKey(Form1.this, alias);
                    X509Certificate[] certificates = KeyChain.getCertificateChain(Form1.this, alias);                   
                    request.proceed(changPrivateKey, certificates);
                } catch (KeyChainException e) {
                    
                } catch (InterruptedException e) {
                    
                }
            }
        },new String[]{"RSA"}, null, null, -1, null);
    }
    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        handler.proceed();
    }
}