Unity SSLStream AuthenticateAsClient 给出 SslPolicyErrors.RemoteCertificateNotAvailable

Unity SSLStream AuthenticateAsClient gives SslPolicyErrors.RemoteCertificateNotAvailable

我正在使用 Unity5 中的安全套接字(在 C# 中)开发一个应用程序,以允许服务器将信息推送到客户端。我想为此使用 Socket 和 SSLStream,以确保通信安全。

我使用 AWS 证书服务提供的证书设置了弹性 beantalk 环境。

我已经编写了一个客户端 class,可以使用下面的 RemoteCertificateValidationCallback 连接到此环境:

 public static bool RemoteCertificateValidationCallback(System.Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    bool isOk = true;
    // If there are errors write them out
    if (sslPolicyErrors != SslPolicyErrors.None)
    {
        //Debug.Log(sslPolicyErrors.ToString());
        Console.WriteLine(sslPolicyErrors.ToString());
        return false;
    }
    return isOk;
}

当我 运行 来自于 Visual Studio 2017 年创建的控制台应用程序的代码时,我得到了预期的 sslPolicyErrors.None。

运行 Unity5 中完全相同的代码(减去控制台引用)给了我 sslPolicyErrors.RemoteCertificateNotAvailable。

我尝试使用 mozroots -import --machine 将证书导入到 Mono 信任库,输出如下:

Issuer: C=US, O=Amazon, OU=Server CA 1B, CN=Amazon
Serial number: 66-xx-xx-xx-xx-xx-xx-xx-xx-xx-46-xx-xx-xx-xx-0D
Valid from 05/05/2017 00:00:00 to 05/06/2018 12:00:00

我一直在四处寻找,但找不到任何东西可以说明为什么它可以作为独立的控制台程序运行,但当 运行 来自 Unity 时却无法运行。如果我特别忽略这个 sslPolicyError,一切正常,客户端和服务器之间的通信按预期进行。但我不想随意忽略可能意味着通信可能受到损害的错误。

我真的希望这里有人有一些想法!

why this works as a standalone console program, but not when run from Unity?

Mono official said一样,Mono不包含根证书,而独立程序使用系统证书。

有一种解决方案是通过 X509Store.

安装证书
string cert = "BASE64 ENCODED CERT(PEM), NOT HEADER AND FOOTER, BASICALLY EXPORTED BY OPENSSL";
byte[] certBytes = Convert.FromBase64String(cert);
X509Certificate2 certificate = new X509Certificate2(cert);
X509Store store = new X509Store(StoreName.Root, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadWrite);
store.Add(certificate);
store.Close();

您可以使用 openssl 导出 pem,例如 openssl x509 -inform DER -in YOUR_CER.cer -out YOUR_PEM.pem

安装正确的证书后,如果连接到受信任的站点,RemoteCertificateValidationCallback 将不再 return RemoteCertificateNotAvailable