Android WebView 处理 onReceivedClientCertRequest [英] Android WebView handle onReceivedClientCertRequest
问题描述
我正在 WebView 中使用客户端证书身份验证开发 Android 应用程序.证书(cert.pfx)和密码嵌入在应用程序中.
I'm developing an Android app using Client Certificate Authentication within WebView. The certificate (cert.pfx) and password are embedded in the application.
在 WebView 中使用 ajax 调用执行客户端证书身份验证请求时,调用以下函数:
When executing Client Certificate Authentication request with ajax call in the WebView, the following function getting called :
@Override
public void onReceivedClientCertRequest(WebView view, final ClientCertRequest request) {}
据我所知,我需要打电话:
As I understend I need to call :
request.proceed(PrivateKey privateKey, X509Certificate[] chain)
任何想法如何从嵌入式证书创建 PrivateKey 和 X509Certificate 对象以继续请求.顺便说一句,这是在 Android 应用程序上实现客户端证书身份验证的正确方法吗?如果没有,请指教.
Any idea how to create the PrivateKey and X509Certificate objects from the embedded certificate in order to proceed with the request. BTW, is this the correct way to implement Client Certificate Authentication on Android app ? if no, please advice.
推荐答案
解决了使用KeyStore获取PrivateKey和X509Certificate对象:
Solved it using KeyStore to obtain the PrivateKey and X509Certificate objects :
private X509Certificate[] mCertificates;
private PrivateKey mPrivateKey;
private void loadCertificateAndPrivateKey() {
try {
InputStream certificateFileStream = getClass().getResourceAsStream("/assets/cert.pfx");
KeyStore keyStore = KeyStore.getInstance("PKCS12");
String password = "password";
keyStore.load(certificateFileStream, password != null ? password.toCharArray() : null);
Enumeration<String> aliases = keyStore.aliases();
String alias = aliases.nextElement();
Key key = keyStore.getKey(alias, password.toCharArray());
if (key instanceof PrivateKey) {
mPrivateKey = (PrivateKey)key;
Certificate cert = keyStore.getCertificate(alias);
mCertificates = new X509Certificate[1];
mCertificates[0] = (X509Certificate)cert;
}
certificateFileStream.close();
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
}
private WebViewClient mWebViewClient = new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return false;
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed();
}
@Override
public void onReceivedClientCertRequest(WebView view, final ClientCertRequest request) {
if (mCertificates == null || mPrivateKey == null) {
loadCertificateAndPrivateKey();
}
request.proceed(mPrivateKey, mCertificates);
}
};
这篇关于Android WebView 处理 onReceivedClientCertRequest的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!