Android WebView 和网络安全配置
Android WebView and network-security-configuration
我正在开发 Android 8(26 API,奥利奥),我在我的应用程序中使用 android.webkit.WebView
。
我会在使用 WebView
加载页面时实施 "secure network connection"(换句话说,我会避免中间人问题和自签名证书)
为此,我使用了网络安全配置(在 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.com
:https://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
从未被检查过,因为我可以设置每个 "random" 和 "wrong" 值,它正常工作(URL MY_DOMAIN.com
正常加载,没有阻塞行为)。
所以这意味着如果某些中间人 return 支持我在 res>xml>network_security_config.xml
中编写的那些不同的引脚,应用程序将继续 运行 并且没有安全行为。
它也不执行 WebViewClient
.
的覆盖错误方法之一
请帮助我无法理解我的错误。
[已解决]
在 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">
[编辑]
SSL 错误在 WebViewClient
的 public void onReceivedSslError(...)
中处理(参见以下代码)
webView.setWebViewClient(new WebViewClient() {
public void onReceivedSslError(WebView view,
final SslErrorHandler handler, SslError error) {
//HANDLE HERE THE ERROR!!!
...
}
...
});
我正在开发 Android 8(26 API,奥利奥),我在我的应用程序中使用 android.webkit.WebView
。
我会在使用 WebView
加载页面时实施 "secure network connection"(换句话说,我会避免中间人问题和自签名证书)
为此,我使用了网络安全配置(在 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.com
:https://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
从未被检查过,因为我可以设置每个 "random" 和 "wrong" 值,它正常工作(URL MY_DOMAIN.com
正常加载,没有阻塞行为)。
所以这意味着如果某些中间人 return 支持我在 res>xml>network_security_config.xml
中编写的那些不同的引脚,应用程序将继续 运行 并且没有安全行为。
它也不执行 WebViewClient
.
请帮助我无法理解我的错误。
[已解决]
在 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">
[编辑]
SSL 错误在 WebViewClient
的 public void onReceivedSslError(...)
中处理(参见以下代码)
webView.setWebViewClient(new WebViewClient() {
public void onReceivedSslError(WebView view,
final SslErrorHandler handler, SslError error) {
//HANDLE HERE THE ERROR!!!
...
}
...
});