Android WebView和网络安全配置

时间:2019-05-06 09:04:54

标签: android android-webview android-network-security-config

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

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

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

所以:

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,因为我可以为该引脚设置每个“随机”和“错误”的值,并且它可以正常工作( URL MY_DOMAIN.com正常加载而没有阻止行为)。

因此,这意味着如果某个中间人返回我在res>xml>network_security_config.xml中编写的那个不同的引脚,则该应用程序将继续正常运行,并且没有任何安全行为。 它还不会执行WebViewClient的一种覆盖错误方法。

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

1 个答案:

答案 0 :(得分:1)

[已解决]

在AndoridManifest.xml中,我声明了

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

编辑器警告有关SDK版本的问题,但我没有看到。 This is the warning

[解决方案]

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

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

[编辑]

public void onReceivedSslError(...)的{​​{1}}中处理了SSL错误(请参见以下代码)

WebViewClient