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

时间:2015-11-03 19:01:27

标签: c# ssl unity3d https mono

尝试使用HTTPWebRequest类进行https调用并返回TlsException时出现问题:从服务器收到的证书无效。尝试GetRequest()时出错代码:0xffffffff800b010a。后来又重新抛出“认证或解密失败”。

所以关于这个链接http://www.mono-project.com/docs/faq/security/以及关于SO的各种问题(这些问题都来自2013年或更早......),我得出结论,问题是单声道默认情况下没有安装根证书。 FAQ指出使用较新版本的mono(3.1),这是不可能的,因为如果仍然在2.x版本的单声道上统一。或使用mozroots.exe文件加载证书。

但我不确定如何在Mac上运行mozroots进行开发,或者将证书包含在项目中,所以当我为Android构建时,它包含了手机使用的证书。

此外,大多数人建议覆盖ServicePointManager.ServerCertificateValidationCallback以返回true,但这有效地绕过了SSL验证,这是不可接受的。如果任何人都可以指出我们正确的方向,使用OS通常与HTTPWebRequest一起使用的预安装电话证书,或者将电话/项目中的证书导入单一证书存储区,那将非常感激。

1 个答案:

答案 0 :(得分:0)

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

  1. 阅读Android上的所有证书。
  2. 在C#侧(单声道内)接收这些证书。
  3. 将证书安装到mono env。
  4. 以下代码段可以获取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#接口可以引用this

    关于如何将证书安装到单个env中可以参考this answer,主要基于X509Store

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