3

我正在 Android 8(26 API,Oreo)上开发,并android.webkit.WebView在我的应用程序中使用。

当我用我的页面加载页面时,我会实现“安全网络连接” WebView(换句话说,我会避免中间人问题和自签名证书)

为此,我使用了网络安全配置(在 Android 上从 7.0 N 版本开始,24 API)

所以:

res>xml>network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">MY_DOMAIN.com</domain>
        <pin-set>
            <pin digest="SHA-256">MY_PIN</pin>
        </pin-set>
    </domain-config>
</network-security-config>

我发现在这里MY_PIN插入MY_DOMAIN.comhttps ://report-uri.com/home/pkp_hash

manifest>AndoridManifest.xml

...
 <application
        android:networkSecurityConfig="@xml/network_security_config"
...
 </application>

在我的应用程序的 onCreate 中,我只需执行以下操作:

WebView webView = new WebView(this);
webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onReceivedSslError(..)..
    @Override
    public void onPageFinished()..
    ...});
webView.loadUrl(MY_DOMAIN.com);

根据 Android 文档,我做得对,但我有一个问题:就像network_security_config.xml从未检查过,因为我可以为 pin 设置每个“随机”和“错误”值并且它正常工作(URLMY_DOMAIN.com正常加载而没有阻塞行为) .

所以这意味着如果某个中间人返回我在res>xml>network_security_config.xml应用程序中编写的一个不同的引脚,则继续运行良好并且没有安全行为。它也不执行其中一种被覆盖的错误方法WebViewClient

请帮助我无法理解我的错误。

4

1 回答 1

2

[解决了]

在 AndoridManifest.xml 我声明

 <application
        android:networkSecurityConfig="@xml/network_security_config"
 ...
 </application>

编辑器警告了与 SDK 版本相关的问题,但我没有看到。 这是警告

[解决方案]

将其添加tools:targetApi="n"到清单中,如下所示:

<application
    android:networkSecurityConfig="@xml/network_security_config"
    ...
    tools:targetApi="n">

[编辑]

SSL 错误被处理public void onReceivedSslError(...)WebViewClient见以下代码)

  webView.setWebViewClient(new WebViewClient() {
            public void onReceivedSslError(WebView view, 
                final SslErrorHandler handler, SslError error) {
                     //HANDLE HERE THE ERROR!!!
                ...
            }
        ...
  });
于 2019-05-06T09:56:39.033 回答