通过Unity Mono在Android设备上获取SSL证书

本文关键字:获取 SSL 证书 Unity Mono Android 通过 | 更新日期: 2023-09-27 18:20:22

尝试使用HTTPWebRequest类进行https调用并返回TlsException时出现问题:从服务器接收到无效证书。尝试GetRequest()时出现错误代码:0xffffffff800b010a。稍后也会重新抛出"身份验证或解密失败"

所以离开这个链接http://www.mono-project.com/docs/faq/security/以及关于SO的各种问题(都是2013年或更早的…),我得出的结论是,问题是mono默认情况下没有安装根证书。常见问题解答指出使用新版本的mono(3.1),这是不可能的,因为如果仍然使用2.x版本的mono-unity。或者使用mozroots.exe文件加载证书。

但我不知道如何在Mac上运行mozroot进行开发,也不知道如何将证书包含在项目中,所以当我为android构建时,它包含了手机使用的证书。

此外,大多数人建议重写ServicePointManager.ServerCertificateValidationCallback以返回true,但这实际上绕过了SSL验证,这是不可接受的。如果有人能为我们指明正确的方向,使用操作系统通常与HTTPWebRequest一起使用的预装电话证书,或者将证书从电话/项目导入mono-cert存储,我们将不胜感激。

通过Unity Mono在Android设备上获取SSL证书

如您所知,mono不包含根CA证书。一个解决办法是从安卓系统安装根证书:

  1. 读取安卓系统上的所有证书
  2. 在C#端(单声道内部)接收这些证书
  3. 将证书安装到mono-env中

以下代码片段可以在Android设备上获取所有CA颁发者。

// Load CAs from an InputStream
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
// Initialise the TMF as you normally would, for example:
tmf.init((KeyStore)null);
TrustManager[] trustManagers = tmf.getTrustManagers();
final X509TrustManager x509Tm = (X509TrustManager)trustManagers[0];
//trusted certificate issuers
X509Certificate[] issuers = x509Tm.getAcceptedIssuers();
//for-each
//byte[] caCert = issuers[i].getEncoded();

android通过byte[]到C#的接口可以参考这个。

关于如何在mono-env中安装证书,可以参考这个答案,主要基于X509Store

注意cert编码格式和存储路径(StoreLocation.CurrentUser)。