在Unity中验证SSL \ TLS证书

时间:2015-03-17 10:11:14

标签: ssl unity3d

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

证书由权威机构签名,在网络浏览器中正常工作。

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

您可以通过X509Store安装证书。安装是持久的,所以只需要调用一次。根据{{​​3}},从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/usr/xxx/.mono在Android上。