没有在 Webview 中获得 onReceivedClientCertRequest 的回调
Not getting callback for onReceivedClientCertRequest in Webview
我需要为 Webview 执行 Public 密钥/证书固定。我看到 API21 中引入了 api
根据 Android 文档,
http://developer.android.com/reference/android/webkit/WebViewClient.html#onReceivedClientCertRequest(android.webkit.WebView, android.webkit.ClientCertRequest)
onReceivedClientCertRequest()
添加到 api 21,但是当我加载任何 url 时我没有收到回调。有人可以帮忙吗????
@Override
public void onReceivedClientCertRequest(WebView view, final ClientCertRequest request) {
Log.e("ClientCertRequest", "===> certificate required!");
KeyChain.choosePrivateKeyAlias(WebViewActivity.this, new KeyChainAliasCallback(){
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public void alias(String alias) {
Log.e(getClass().getSimpleName(), "===>Key alias is: " + alias);
try {
PrivateKey changPrivateKey = KeyChain.getPrivateKey(WebViewActivity.this, alias);
X509Certificate[] certificates = KeyChain.getCertificateChain(WebViewActivity.this, alias);
Log.v(getClass().getSimpleName(), "===>Getting Private Key Success!" );
request.proceed(changPrivateKey, certificates);
} catch (KeyChainException e) {
Log.e(getClass().getSimpleName(), Util.printException(e));
} catch (InterruptedException e) {
Log.e(getClass().getSimpleName(), Util.printException(e));
}
}
},new String[]{"RSA"}, null, null, -1, null);
super.onReceivedClientCertRequest(view,request);
}
在 Android 中,客户端证书身份验证可能会以多种方式失败:
- 您的 WebViewClient 可能连接不正确:确保您从 WebView 获得其他通知,例如
WebViewClient.onPageStarted()
- 确保您实际使用的是 SSL 和 https URL
- SSL 可能会在您进行客户端证书检查之前失败。这是典型的自签名服务器证书。您可以通过在
WebViewClient.onReceivedSslError(view, handler, error)
中调用 handler.proceed()
来解决此问题
- 服务器端可能未启用 SSL 客户端证书身份验证。使用 Apache 时,在配置
中设置类似 SSLVerifyClient require
的内容以及所需的参数 SSLVerifyDepth
和 SSLCACertificateFile
- 在服务器上使用有效的 CA 证书(由您或第三方创建)和由该 CA 证书签署的客户端证书
- 确保 Android 设备上安装了客户端证书。您通常将客户端证书作为 PKCS 12 文件(pfx 文件扩展名)复制到设备的存储空间
我需要为 Webview 执行 Public 密钥/证书固定。我看到 API21 中引入了 api 根据 Android 文档, http://developer.android.com/reference/android/webkit/WebViewClient.html#onReceivedClientCertRequest(android.webkit.WebView, android.webkit.ClientCertRequest)
onReceivedClientCertRequest()
添加到 api 21,但是当我加载任何 url 时我没有收到回调。有人可以帮忙吗????
@Override
public void onReceivedClientCertRequest(WebView view, final ClientCertRequest request) {
Log.e("ClientCertRequest", "===> certificate required!");
KeyChain.choosePrivateKeyAlias(WebViewActivity.this, new KeyChainAliasCallback(){
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public void alias(String alias) {
Log.e(getClass().getSimpleName(), "===>Key alias is: " + alias);
try {
PrivateKey changPrivateKey = KeyChain.getPrivateKey(WebViewActivity.this, alias);
X509Certificate[] certificates = KeyChain.getCertificateChain(WebViewActivity.this, alias);
Log.v(getClass().getSimpleName(), "===>Getting Private Key Success!" );
request.proceed(changPrivateKey, certificates);
} catch (KeyChainException e) {
Log.e(getClass().getSimpleName(), Util.printException(e));
} catch (InterruptedException e) {
Log.e(getClass().getSimpleName(), Util.printException(e));
}
}
},new String[]{"RSA"}, null, null, -1, null);
super.onReceivedClientCertRequest(view,request);
}
在 Android 中,客户端证书身份验证可能会以多种方式失败:
- 您的 WebViewClient 可能连接不正确:确保您从 WebView 获得其他通知,例如
WebViewClient.onPageStarted()
- 确保您实际使用的是 SSL 和 https URL
- SSL 可能会在您进行客户端证书检查之前失败。这是典型的自签名服务器证书。您可以通过在
WebViewClient.onReceivedSslError(view, handler, error)
中调用 - 服务器端可能未启用 SSL 客户端证书身份验证。使用 Apache 时,在配置 中设置类似
- 在服务器上使用有效的 CA 证书(由您或第三方创建)和由该 CA 证书签署的客户端证书
- 确保 Android 设备上安装了客户端证书。您通常将客户端证书作为 PKCS 12 文件(pfx 文件扩展名)复制到设备的存储空间
handler.proceed()
来解决此问题
SSLVerifyClient require
的内容以及所需的参数 SSLVerifyDepth
和 SSLCACertificateFile