在Unity中验证SSL\TLS证书

7

我在 Unity 中遇到了证书验证的问题。我使用 .Net 类 HttpWebResponse 发送请求并提供回调函数给 ServicePointManager.ServerCertificateValidationCallback。

该证书由权威机构签名,在 Web 浏览器中运行良好。

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

我认为问题在于空的根证书存储和空的 CRLs 列表。我查看了 Mono 源代码并发现这些数据应该从 X509Store 中获取,但某种原因它不包含任何根证书或 CRLs。

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

假设我知道根证书的权威机构,我可以在应用程序启动时将其添加到存储中。但这与 CRLs 不起作用。平台是 Android\IOS。

问题是:如何强制 Unity 安装根证书和 CRLs?

1个回答

0
您可以通过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();
}

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


在Unity Android上尝试这样做时,我收到了错误提示: System.UnauthorizedAccessException: 拒绝访问路径"./config"。 出错的代码行是“store.Add(certificate);”这里出了什么问题? - DAVco
@DAVco 这是旧版Mono的另一个问题,即默认路径在Android中不可访问。尝试使用Environment.SetEnvironmentVariable("HOME", <在您的情况下正确的路径>)来更改Mono的默认路径,例如抽象外部路径/sdcard/..或您的包data/data/路径。 - sakiM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接