从Android 9 Pie开始,没有加密的请求永远不会起作用.默认情况下,系统会指望您默认使用TLS.您可以在此处阅读此功能因此,如果您只通过HTTPS发出请求,那么您就是安全的.但是那些通过不同网站提出请求的应用程序呢,例如类似浏览器的应用程序.
如何在Android 9 Pie中启用对HTTP和HTTPS的所有类型连接的请求?
java android kotlin android-network-security-config android-9.0-pie
我的应用程序有免费和付费两种版本。现在,我们正在向在模拟服务器中运行的付费风格添加测试,我们需要以明文方式与其进行通信,因此尝试仅在 androidTestPaid 中添加网络安全配置(我们在主源根目录中没有) 。不幸的是,该配置似乎被完全忽略了。
androidTestPaid/AndroidManifest.xml
<manifest ...>
<application
tools:node="merge"
android:networkSecurityConfig="@xml/network_security_config"
android:usesCleartextTraffic="true"
... />
</application>
<instrumentation android:name="...CustomTestRunner" ... />
</manifest>
Run Code Online (Sandbox Code Playgroud)
androidTestPaid/res/xml/network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">127.0.0.1</domain>
</domain-config>
</network-security-config>
Run Code Online (Sandbox Code Playgroud)
在我们的 gradle 文件中,我们不会对特定于风味的 Android 测试的源集执行任何操作,但我们会对基本 Android 测试执行任何操作。这会导致问题吗?
构建.gradle
android {
sourceSets {
androidTest {
java.srcDirs = ['src/androidTest/java', 'src/testShared/java']
testOptions {
animationsDisabled = true
}
}
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
什么会阻止我们的测试中采用此配置?
我正在尝试按照此处使用自定义证书的 Android 文档进行操作。所需的网络配置文件是:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config>
<trust-anchors>
<certificates src="@raw/extracas"/>
<certificates src="system"/>
</trust-anchors>
</base-config>
</network-security-config>
Run Code Online (Sandbox Code Playgroud)
我已经创建了 network_security_config.xml 并将引用 a 添加ndroid:networkSecurityConfig="@xml/network_security_config"
到我的清单中。我有需要包含的 .crt 文件,但我有两个问题:
我无法在我的原始文件夹中创建目录,当我这样做时,它会在我的文件系统中创建目录,但不在项目中的原始资源目录中。
代替目录,我只是直接在原始文件夹中引用我的 .crt 文件,但是当我尝试引用证书时,这是我的 network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config>
<trust-anchors>
<certificates src="@raw/cert_cubic_trusted_ca-sha256.crt"/>
<certificates src="system"/>
</trust-anchors>
</base-config>
</network-security-config>
Run Code Online (Sandbox Code Playgroud)我得到一个红色波浪线,错误“缺少 src 资源。”,当我尝试构建时,构建日志输出错误:
AGPBI: {"kind":"error","text":"error: resource raw/certname.crt (aka com.comname.appname:raw/certname.crt) not found.","sources":[{"file":"/Users/205314/project/appname/app/src/main/res/xml/network_security_config.xml","position":{"startLine":5}}],"original":"","tool":"AAPT"}
:app:processDebugResources
:app:processDebugResources FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:processDebugResources'.
> Failed to process resources, see …
Run Code Online (Sandbox Code Playgroud) android android-manifest android-xml android-gradle-plugin android-network-security-config
为了在 Android 中的本地主机上进行 http-API 调用,我需要添加一个网络安全配置来定义我的本地 IP 地址。当然,每个开发者的本地IP地址都是不同的,所以我把这个值放进去,gradle.properties
这样每个人都可以自己覆盖它。但是,我还没有找到如何将该值包含在文件中network-security-config.xml
。我尝试创建 abuildConfigField
或resValue
in build.gradle
,但两者似乎都不起作用。我能做些什么?
网络安全配置.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<!-- We are allowed to call localhost on http instead of https:
/sf/ask/3215860301/ -->
<domain includeSubdomains="true">LOCALHOST</domain>
</domain-config>
</network-security-config>
Run Code Online (Sandbox Code Playgroud)
应用程序/build.gradle
buildTypes {
debug {
buildConfigField "String", "LOCALHOST", localIpAddress
resValue "string", "LOCALHOST", localIpAddress
}
}
Run Code Online (Sandbox Code Playgroud)
gradle.properties
localIpAddress="IP_ADDRESS_HERE"
Run Code Online (Sandbox Code Playgroud)
network_security_config.xml
也欢迎任何其他如何优雅地包含我的本地 IP 地址的解决方案!
android localhost android-build-type android-network-security-config
为了实现证书锁定,我根据Android 文档进行了以下设置来测试 Flutter 的网络安全性:
请注意,我指定了domain-config
for api.somesite.com
。所以应用程序应该只接受somesite.com
证书。
请注意,android:networkSecurityConfig="@xml/network_security_config"
在AndroidManifest.xml
.
为了测试固定证书,我对两个端点进行了两次 HTTP 调用。一个来自api.somesite.com
,另一个是随机api。
但是,两个 API 端点都使用网络安全设置工作。
我不确定我做错了什么,以及为什么按照 Android 文档固定证书似乎对颤振本身没有任何影响。
任何帮助将非常感激。
有人能帮助我吗?我在我的 Android 应用程序中使用 WebView
compileSdkVersion 29
buildToolsVersion "29.0.0"
minSdkVersion 16
targetSdkVersion 29
Run Code Online (Sandbox Code Playgroud)
我在 AmdroidManifest 中有配置 https 并创建了一个配置文件但没有更改我收到明文错误:
(净::ERR_CLEARTEXT_NOT_PERMITTED)
@xml/network_security_config
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">www.mydomaine.com</domain>
</domain-config>
</network-security-config>
Run Code Online (Sandbox Code Playgroud)
AndroidManifest.xml
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:hardwareAccelerated="true"
android:networkSecurityConfig="@xml/network_security_config"
android:usesCleartextTraffic="true"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
Run Code Online (Sandbox Code Playgroud)
WabView 类
public void LoadWeb() {
webView = (WebView) findViewById(R.id.webview_test);
webView.getSettings().setAppCacheEnabled(false);
webView.clearCache(true);
webView.reload();
webView.getSettings().setJavaScriptEnabled(false);
webView.getSettings().setLoadsImagesAutomatically(true);
webView.loadUrl("https://www,mydomaine.com");
swipe.setRefreshing(true);
webView.setWebViewClient(new WebViewClient() {
public void onPageStarted(WebView view, String url, Bitmap favicon) {
// TODO Auto-generated method stub
super.onPageStarted(view, …
Run Code Online (Sandbox Code Playgroud) java android android-webview android-network-security-config
我创建了一个向用户显示特定站点的应用程序,我正在使用 Web 视图来完成该任务。当我尝试加载该特定站点的 web 视图时,什么也没有显示,日志 cat 说,
E/chromium: [ERROR:ssl_client_socket_impl.cc(946)] 握手失败;返回 -1,SSL 错误代码 1,net_error -202
因此,经过一番搜索后,我发现这个答案可以忽略此 SSL 证书错误,并使用以下代码我可以加载该站点。
webView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed();
Log.d("ssl_error", error.toString());
}
});
Run Code Online (Sandbox Code Playgroud)
当我发送error.toString()
给 log cat 时,它说,
主要错误:3 证书:颁发给:[该特定站点的公司的一些详细信息] 颁发者:CN=GeoTrust RSA CA 2018,OU=www.digicert.com,O=DigiCert Inc,C=US;在 URL: [那个特定的站点 url]
但是我想在不忽略它的情况下修复该错误。
正如前面提到的堆栈溢出答案一样,我无法匹配https://developer.android.com/training/articles/security-config的详细信息来解决这个问题而不忽略它。我应该如何配置网络来解决这个问题?
注意:- 我只想在一个特定站点上工作。无需与任何网站合作
从 Android 9 开始,Android 默认情况下仅允许通过 HTTPS 进行网络连接。然而,我正在做的唯一请求是通过本地主机(例如http://10.41.199.226:port/FooBar
)完成的,该本地主机由HttpListener
侦听该地址:端口组合的(C#)处理。
由于此请求是通过 HTTP 发出的,因此 Android 默认情况下不允许这样做。按照Android 关于该文件的文档,network_security_config
我可以通过添加以下network_security_config.xml
文件来允许 HTTP 连接
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
<certificates src="user" />
</trust-anchors>
</base-config>
<debug-overrides>
<trust-anchors>
<certificates src="user" />
</trust-anchors>
</debug-overrides>
</network-security-config>
Run Code Online (Sandbox Code Playgroud)
这是使用 Android 清单调用的android:networkSecurityConfig="@xml/network_security_config"
。
这允许完成 HTTP 请求,但是因为这设置了基本配置,所以允许在整个应用程序中发出 HTTP 请求。这不是一个好主意,因为我将来可能想添加传出请求,我希望通过 HTTPS 发送请求,并且希望为此建立安全网。让这成为一条不可行的道路。
在同一文档中,他们进一步介绍了domain-config
允许您根据域进行设置的功能cleartextTrafficPermitted
,我尝试使用以下域集进行设置
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">127.0.0.1</domain>
<domain includeSubdomains="true">10.0.0.1</domain>
<domain includeSubdomains="true">localhost</domain>
</domain-config>
</network-security-config>
Run Code Online (Sandbox Code Playgroud)
由于没有结果,请求仍然因不是 https …
https android http android-manifest android-network-security-config