Unity SSLStream AuthenticateAsClient提供SslPolicyErrors.RemoteCertificateNotAvailable

时间:2017-05-06 11:23:20

标签: c# ssl unity3d mono unity5

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

我有一个弹性beanstalk环境设置,其中包含AWS证书服务提供的证书。

我已编写了一个客户端类,可以使用下面的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,一切正常,客户端和服务器之间的通信按预期发生。但我不想随意忽略可能意味着通信可能受到损害的错误。

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

1 个答案:

答案 0 :(得分:0)

  

为什么它作为一个独立的控制台程序工作,但从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将不再返回RemoteCertificateNotAvailable