在webview组件上选择证书ssl
问题描述:
打开页面以从存储中建立必要的SSL证书(自签名)时,我无法找到如何强制组件的方法。在webview组件上选择证书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添加变更证明书,这是因为在普通的浏览器:
的图片在浏览器中看起来像下面
这里只是为了做到这一点吗?
答
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();
}
}