- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
根据安全扫描程序的结果,我需要限制应用信任的证书颁发机构。
扫描结果指向webView.loadUrl("https://example.com/page");
这一行。我看到了如何创建一个使用我的 TrustManager 的 SslSocketFactory,但我在 WebView 中没有看到允许我设置它的 API。
https://developer.android.com/training/articles/security-ssl.html#UnknownCa
有哪些可能的方法可以实现这一点?
最佳答案
我认为 WebViewClient
的 onReceivedSslError
方法将是一个很好的切入点。
首先,遵循来自 https://developer.android.com/training/articles/security-ssl.html#UnknownCa 的完全相同的 fragment 准备 TrustManager。
TrustManagerFactory tmf = null;
private void initTrustStore() throws
java.security.cert.CertificateException, FileNotFoundException,
IOException, KeyStoreException, NoSuchAlgorithmException {
// Create a KeyStore containing our trusted CAs
String keyStoreType = KeyStore.getDefaultType();
KeyStore trustedKeyStore = KeyStore.getInstance(keyStoreType);
trustedKeyStore.load(null, null);
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream caInput = new BufferedInputStream(
getResources().getAssets().open("ca.crt"));
Certificate ca;
try {
ca = cf.generateCertificate(caInput);
Log.d(TAG, "ca-root DN=" + ((X509Certificate) ca).getSubjectDN());
}
finally {
caInput.close();
}
trustedKeyStore.setCertificateEntry("ca", ca);
// Create a TrustManager that trusts the CAs in our KeyStore
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(trustedKeyStore);
}
然后,扩展自定义 WebViewClient 类,检查来自 https://stackoverflow.com/a/6379434/1099884 的 fragment
private class CheckServerTrustedWebViewClient extends WebViewClient{
public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
Log.d(TAG, "onReceivedSslError");
boolean passVerify = false;
if(error.getPrimaryError() == SslError.SSL_UNTRUSTED){
SslCertificate cert = error.getCertificate();
String subjectDN = cert.getIssuedTo().getDName();
Log.d(TAG, "subjectDN: "+subjectDN);
try{
Field f = cert.getClass().getDeclaredField("mX509Certificate");
f.setAccessible(true);
X509Certificate x509 = (X509Certificate)f.get(cert);
X509Certificate[] chain = {x509};
for (TrustManager trustManager: tmf.getTrustManagers()) {
if (trustManager instanceof X509TrustManager) {
X509TrustManager x509TrustManager = (X509TrustManager)trustManager;
try{
x509TrustManager.checkServerTrusted(chain, "generic");
passVerify = true;break;
}catch(Exception e){
Log.e(TAG, "verify trustManager failed", e);
passVerify = false;
}
}
}
Log.d(TAG, "passVerify: "+passVerify);
}catch(Exception e){
Log.e(TAG, "verify cert fail", e);
}
}
if(passVerify == true)handler.proceed();
else handler.cancel();
}
}
最后,将CheckServerTrustedWebViewClient
设置为WebView
webView.setWebViewClient(new CheckServerTrustedWebViewClient());
但是,有一个问题。准备好的 CA 证书与服务器的签名完全相同(中间 CA 不是根 CA)。只提供根 CA 证书是行不通的。 TrustManager 不能在运行时下载服务器证书链吗?有什么建议吗?
关于android - 在 WebView loadUrl() 中信任证书颁发机构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40349141/
我的 WebView 适用于 Google.com 等网站,但不会加载特定页面。 简单地显示subscribe to feedburner(我制作这个网站是为了反射(reflect)一个转换后的新闻提
我的 webview 收费从服务器查看页面 private String url = "http://192.168.33.37/gestpresenze/index.html"; @Override
我已经使用 addJavascriptInterface() 方法向 WebView 添加了一个 Javascript 接口(interface)对象,我正在尝试使用 WebView.loadUrl(
我有一个测试页面,可以为测试的每个问题从 HTML 加载数据。每当我从 HTML 中获取视频作为 iFrame 时,我都会将其解析为数据 URI,然后在 WebView 中显示该视频。我使用同一页面来
我写了一个方法来从用户那里获取地址信息,然后将其显示在谷歌的 map 上。这是我写的方法 function doRemoteMapEmployee(e) { var mapEmployeeAddres
刚刚开始使用 Electron,我希望能够使用 loadURL 加载页面,但不替换整个页面。 这里的想法是如何使用像部分/模板这样的东西,这样我就可以在顶部和底部拥有一致的布局,但将不断变化的内容引入
(首先,我要声明一下,我的专业领域是 HTML5(和 php/coldfusion),而我是 Java/Android 的初学者) 在我的 onCreateOptionsMenu 中,我有以下代码来处
我有一个从 android webview 播放音乐的应用程序,我已经自动播放到下一首歌曲,为了播放下一首歌曲,我需要在 webview 中加载新的 url。一切正常。但是当我从 webview 添加
我的 Android 应用程序有一个更新类,在同一个应用程序中,我有另一个通过 webview 打开网站的类。问题是我想让更新类加载 url 但不显示它,然后缓存它(如果可能的话,所以如果用户离线它应
我想创建一个可以在应用程序中打开网站的应用程序。所以我想使用webview。但是,当我使用“loadurl”功能时,该应用程序在手机(Android 4.2.2)上崩溃了。你知道问题出在哪里吗? 错误
我试图在 webview 中打开 url,但它在外部浏览器中打开 url。 我的代码是 public class MainActivity extends Activity { private
我知道要在 webview 中运行 javascript 函数,我们需要在 loadUrl() 中加载它。在我的程序中,当我在 loadUrl 中使用它时,一切正常 javascript 被调用,但
我有三个 fragment 。我已经从第三个 fragment 向第一个 fragment 发送了一个字符串(URL)。第一个 fragment 有一个 webView 。我想在我从第三个 fragm
我的 WebView 是这样设置的 public class Webview extends Activity { private WebView webView; @Override protect
我正在尝试加载页面,然后执行 JavaScript 代码,如下所示: webview.setWebViewClient(new WebViewClient() { @Over
当我点击 webview 页面中的按钮时出现错误。据说,当我单击按钮时,它将更改为 google 站点。以下是代码和错误:- 主 Activity .java package com.mt.nad.t
是否可以将值传递给 webView.loadUrl 中提到的 URL?像这样的?? webView.loadUrl("file:///android_asset/www/index.html#valu
当尝试在我的 Android Things webview 中加载 url 时,页面最初加载,然后使 UI 崩溃并显示一条指向 IoT FrameworkPackageStubs 的错误消息。 我在
这是我的代码: package sai.datla.game; import android.app.Activity; import android.os.Bundle; import androi
backbone.js 网站上没有 Backbone.history.loadURL 的文档 http://backbonejs.org/#History-start虽然我对它在我看过的某些应用程序中
我是一名优秀的程序员,十分优秀!