【问题标题】:Getting SSL Certificates onto Android Device Thru Unity Mono通过 Unity Mono 在 Android 设备上获取 SSL 证书
【发布时间】:2016-02-04 01:44:57
【问题描述】:

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

因此,关闭此链接http://www.mono-project.com/docs/faq/security/ 和关于 SO 的各种问题(都是 2013 年或更早的...),我得出的结论是,问题在于 mono 没有默认安装根证书。常见问题解答指向使用较新版本的单声道(3.1),如果仍然使用单声道的 2.x 版本,这是不可能的,因为统一。或使用 mozroots.exe 文件加载证书。

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

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

【问题讨论】:

  • 您最终找到了解决方法吗?我在使用 SmtpClient 时遇到了同样的问题,我感谢有关该主题的任何信息。

标签: c# ssl unity3d https mono


【解决方案1】:

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

  1. 阅读 Android 上的所有证书。
  2. 在 C# 端(单声道内)接收这些证书。
  3. 将证书安装到单声道环境中。

以下代码 sn -p 可以获取 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

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

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

【讨论】:

    猜你喜欢
    • 2018-04-08
    • 2017-04-28
    • 2022-06-17
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    相关资源
    最近更新 更多