在系统上下文中在android上安装CA证书
我需要从我的Xamarin应用程序通过HTTPS访问REST API。当然,在我的开发环境中,我不使用公开签名的证书,而是从本地CA签名。因此,我需要将CA证书添加到Android emulator上的受信任CA。在一些谷歌搜索之后,我发现的第一种方法是,将它拖放到模拟器中,然后用“文件”应用程序安装它。但这似乎只是在用户上下文中安装它。我的应用程序似乎并不关心这一点,因为它仍然不接受来自API的证书作为受信任的证书。所以我又找了一些 下一种方法是从证书中获取颁发者哈希值,在该值之后重命名文件,禁用在系统上下文中在android上安装CA证书,android,xamarin.android,certificate,Android,Xamarin.android,Certificate,我需要从我的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都不允许这样做。幸运的是,可以将其用于特定领域,我认为这是一个可接受的解决方案: 安卓 在这里找到
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
更改为您的域…我给您的建议是避免与自签名证书混淆,因为这可能是一个真正令人头痛的问题。只需使用HTTPHTTP
构建您的应用程序,然后我们就可以让您最终准备好部署、打开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>