【问题标题】:Validating SSL\TLS certificate in Unity在 Unity 中验证 SSL\TLS 证书
【发布时间】:2015-05-19 17:18:45
【问题描述】:

我在统一进行证书验证时遇到问题。我使用 .Net 类 HttpWebResponse 发出请求并向 ServicePointManager.ServerCertificateValidationCallback 提供回调函数。

证书由权威机构签署,可在网络浏览器中正常使用。

验证失败,状态为: X509ChainStatusFlags.PartialChain X509ChainStatusFlags.RevocationStatusUnknown X509ChainStatusFlags.OfflineRevocation

问题,我怎么看,是空的根证书存储和空的 CRL 列表。我打开 Mono 源代码,发现这些数据应该是从 X509Store 获取的,但不知何故,它不包含任何 Root 证书或 CRL。

我需要实现证书的正确验证,而不仅仅是通过在 ServerCertificateValidationCallback 中返回 true 或硬编码证书指纹来跳过它,为此我需要提供所有必需的数据。

假设我知道 Root 权限,我可以在应用程序启动时将其添加到存储中。但它不适用于 CRL。平台为Android\IOS。

问题是:如何强制统一安装 Root 和 CRL?

【问题讨论】:

    标签: ssl unity3d


    【解决方案1】:

    您可以通过 X509Store 安装证书。安装是持久的,所以只需要调用一次。根据 X509Certificate2 从 Base64 或 DER 字节创建证书。可以通过openssl导出:openssl x509 -inform DER -in YOUR_ROOT_CER.cer -out YOUR_BASE64_PEM.pem

    private static void InstallCertificate(byte[] cert)
    {
        X509Certificate2 certificate = new X509Certificate2(cert);
        X509Store store = new X509Store(StoreName.Root, StoreLocation.CurrentUser);
        store.Open(OpenFlags.ReadWrite);
        store.Add(certificate);
        store.Close();
    }
    

    注意StoreLocation.CurrentUser 指向/data/data/<your.package.name>/.mono/,而StoreLocation.LocalMachine 在android 上是/usr/xxx/.mono

    【讨论】:

    • 尝试在 Unity Android 上执行此操作,我收到错误:System.UnauthorizedAccessException: Access to the path "./config" is denied.就行“store.Add(certificate);”这里出了什么问题?
    • @DAVco 这是旧单声道版本中的另一个问题,默认路径在 android 中无法访问。尝试使用Environment.SetEnvironmentVariable("HOME", <a correct path in your case>); 更改单声道默认路径,例如抽象外部路径/sdcard/.. 或您的包data/data/ 路径。
    猜你喜欢
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多