信任额外的 CAsh 并在 net 6 MAUI 解决方案中使用 Android 证书存储

Trust additional CAs and make use of the Android certificate store in a net6 MAUI solution

System.Net.WebException: 
java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.'

这是我的 VS2022 解决方案在使用自签名证书和 Android 时发生的错误。

案例如下:
它是一个在本地网络上运行的 android 应用程序,具有本地 https 后端服务。域管理员已为此服务颁发证书。但是,该域不是官方 CA(证书颁发机构)。然后您必须通过设置手动安装 CA。

部分解决方案
我为解决这个问题所做的是将 CA 证书添加到 Android 设备(通过设置 > 安全 -> 加密和凭证 -> 安装证书)。

android 应用程序中的 Web 浏览器现在可以成功访问 https 站点,没有警告。

我仍然需要帮助
但是,除非通过网络安全配置配置,否则无法通过应用程序访问 CA 商店:https://developer.android.com/training/articles/security-config#TrustingAdditionalCas

这是在 Xamarin 时代可以完成的事情,例如:

但在 MAUI 中我有点迷路,我没有看到正确的资源、mipmap 等

我想用这样的一行解决这个问题:

[assembly: Application(UsesCleartextTraffic = true)]

...也可以通过 via network-security-config 进行配置。

是否有单线或有人可以帮助我配置我的网络安全配置以使 CA 存储在 MAUI 解决方案中可用?

好的,所以我在这里看到了一些东西,但不确定您到底在寻找什么,所以让我一一讨论。

让我们开始:如果可以,请避免使用明文流量! ;)

使用 ClearTextTraffic 属性

然后,简单的,你想要[assembly: Application(UsesCleartextTraffic = true)] oneliner。你仍然可以完全做到这一点,实际上你现在可以在整个项目中做到这一点。但它在 Android.

中最有意义

请注意该属性是如何表示 assembly 的,因此它无论如何都适用于整个程序集,并且将它放在哪里并不重要。这就是它通常的工作方式。 但是,在 .NET MAUI 中,MainApplication 上面已经有一个 [Application] 属性,所以打开它并像下面那样修改它。

namespace MauiAndroidClearText;

[Application(UsesCleartextTraffic = true)]
public class MainApplication : MauiApplication
{
   // Your code
}

网络安全配置

基本上,您单独的 Android 项目现在位于 Platforms\Android 文件夹下。你放在那里的所有东西,即使默认情况下不在那里,仍然会像在单独的 Android 项目中一样表现。

因此您仍然可以在 Resources 下添加一个 xml 文件夹(即在 Android 文件夹下),然后添加 network_security_config.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="true">10.0.2.2</domain> <!-- Debug port -->
    <domain includeSubdomains="true">xamarin.com</domain>
  </domain-config>
</network-security-config>

然后在您的 AndroidManifest.xml 中将 android:networkSecurityConfig="@xml/network_security_config" 属性添加到您的 Application node

在此处查看完整示例:https://github.com/jfversluis/MauiAndroidClearText

经过杰拉德的建议,“所以你仍然可以在 Resources 下添加一个 xml 文件夹(在 Android 文件夹下),我终于明白了!

在 Android 文件夹下添加一个 network_security_config.xml 文件,其中:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config>
        <trust-anchors>
        <!-- Trust preinstalled CAs -->
        <certificates src="system" />
        <!-- Additionaly trusted user added CAs -->
        <certificates src="user"/>
    </trust-anchors>
    </base-config>
</network-security-config>

然后在您的 AndroidManifest.xml 中添加:android:networkSecurityConfig="@xml/network_security_config" 属性到您的应用程序节点。
所以,把它添加到已经存在的节点上,不要添加新节点(否则你会得到奇怪的错误):

并且信任锚异常消失了,但我仍然很好奇是否还有另一种方法 - 没有 network-security-config。 ;-)

PS 不要忘记将 CA 证书添加到 Android 设备,如原始问题中所述。