Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在系统上下文中在android上安装CA证书_Android_Xamarin.android_Certificate - Fatal编程技术网

在系统上下文中在android上安装CA证书

在系统上下文中在android上安装CA证书,android,xamarin.android,certificate,Android,Xamarin.android,Certificate,我需要从我的Xamarin应用程序通过HTTPS访问REST API。当然,在我的开发环境中,我不使用公开签名的证书,而是从本地CA签名。因此,我需要将CA证书添加到Android emulator上的受信任CA。在一些谷歌搜索之后,我发现的第一种方法是,将它拖放到模拟器中,然后用“文件”应用程序安装它。但这似乎只是在用户上下文中安装它。我的应用程序似乎并不关心这一点,因为它仍然不接受来自API的证书作为受信任的证书。所以我又找了一些 下一种方法是从证书中获取颁发者哈希值,在该值之后重命名文件,

我需要从我的Xamarin应用程序通过HTTPS访问REST API。当然,在我的开发环境中,我不使用公开签名的证书,而是从本地CA签名。因此,我需要将CA证书添加到Android emulator上的受信任CA。在一些谷歌搜索之后,我发现的第一种方法是,将它拖放到模拟器中,然后用“文件”应用程序安装它。但这似乎只是在用户上下文中安装它。我的应用程序似乎并不关心这一点,因为它仍然不接受来自API的证书作为受信任的证书。所以我又找了一些

下一种方法是从证书中获取颁发者哈希值,在该值之后重命名文件,禁用
Google api
Google Play Store
,然后执行以下操作:

emulator -avd <avd_name_here> -writable-system

adb root
adb shell remount
adb push <cert_filename> /system/etc/security/cacerts
adb shell "chmod 664 /system/etc/security/cacerts/<cert_filename>"

adb reboot
emulator-avd-可写系统
亚行根
adb外壳重新安装
adb推送/系统/etc/安全/cacerts
adb shell“chmod 664/system/etc/security/cacerts/”
亚洲开发银行重启
这确实有效,但也有一些缺点。始终使用
-writable system
启动模拟器,这意味着我必须手动启动它,而不是从Visual Studio启动,并保持
Google API
Google Play Store
处于禁用状态。我不知道禁用这些API会有什么不同


我真不敢相信这是安装CA证书的唯一方法。如何在真正的设备上实现?我想我不能只是在那里禁用google API?

Tim Biegeleisen的评论让我花了一些时间研究以纯文本方式访问API的方向。默认情况下,Android和iOS都不允许这样做。幸运的是,可以将其用于特定领域,我认为这是一个可接受的解决方案:

安卓 在这里找到

  • 在Android项目的资源下添加以下文件和文件夹:
    xml\network\u security\u config.xml
  • 向文件中添加如下行:
  • 网间网操作系统 可在此处找到:

    info.plist
    中添加如下内容:

    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>domain.com</key>
            <dict>
                <key>NSExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSIncludesSubdomains</key>
                <true/>
            </dict>
        </dict>
    </dict>
    
    NSAppTransportSecurity
    NSExceptionDomains
    domain.com
    N异常低安全Http负载
    n包括多个域
    

    domain.com
    更改为您的域…

    我给您的建议是避免与自签名证书混淆,因为这可能是一个真正令人头痛的问题。只需使用HTTP
    HTTP
    构建您的应用程序,然后我们就可以让您最终准备好部署、打开SSL并使用来自已知权威机构的CA。JVM应该已经在其托管库中为该CA提供了一个证书,并且您根本不需要进行任何配置工作。这似乎是我可以确认的最简单的方法,使用自签名证书确实令人头疼。无法使它在两种平台上都工作,并切换到
    HTTP
    。真令人失望。
        <manifest>
        <application android:networkSecurityConfig="@xml/network_security_config">
            ...
        </application>
        </manifest>
    
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>domain.com</key>
            <dict>
                <key>NSExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSIncludesSubdomains</key>
                <true/>
            </dict>
        </dict>
    </dict>