【问题标题】:AWS S3 .NET SDKAWS S3 .NET 开发工具包
【发布时间】:2011-11-10 12:49:54
【问题描述】:

我正在使用 Unity3D,并尝试使用 S3 .NET SDK。但不断出现以下错误:

TlsException: Invalid certificate received from server. Error code: 0xffffffff80092012
Mono.Security.Protocol.Tls.Handshake.Client.TlsServerCertificate.validateCertificates (Mono.Security.X509.X509CertificateCollection certificates)
Mono.Security.Protocol.Tls.Handshake.Client.TlsServerCertificate.ProcessAsTls1 ()

我的 javascript 代码:

function Start()
{
    client = Amazon.AWSClientFactory.CreateAmazonS3Client(Conf.AWSAccessKey, Conf.AWSSecretKey);

    var response : ListBucketsResponse = client.ListBuckets();
}

找了一整天,大概找到了原因:

事实证明,Mono 安装时没有根证书,因此默认情况下,Mono 拒绝信任任何受 SSL 保护的 Web 服务。 The Mono Security FAQ 有几个关于如何处理问题的建议。”

我尝试了以下方法:

  1. Reference

    mcs am1.cs
    
    mono am1.exe https://www.amazonaws.com
    

    当我运行编译好的 am1.exe 时,它​​给了我很多异常错误

  2. 使用 mozroots.exe 工具下载并安装所有 Mozilla 的根证书。

    C:\Program Files (x86)\Mono-2.6.7\lib\mono\1.0>mozroots --import --machine --sync
    

    虽然输出表明证书已成功导入。但是在Unity3D中还是提示“Invalid certificate received from server”

我整天都在研究这个问题,但无法解决,希望有人能帮助我。

【问题讨论】:

    标签: ssl mono amazon-s3 amazon-web-services unity3d


    【解决方案1】:

    0x80092012在无法验证证书以进行吊销时发生。

    从 2.8 版开始,Mono 将默认为 X509RevocationMode.NoCheck,除非设置了 MONO_X509_REVOCATION_MODE 环境变量(在这种情况下,它将检查证书存储中的 CRL)。

    我不知道您的 Unity3D 版本与 Mono 本身相比有多新。但是,您应该能够使用ICertificatePolicyServicePointManager.ServerCertificateValidationCallback 来解决此问题。如果 0x80092012 错误代码来自颁发给亚马逊的证书,则只需忽略它即可。

    【讨论】:

    • 第一个包含此功能的版本是什么?
    • @knocte 我不记得了,但那是在 2011 年 9 月之前 ;-) 要找到它,您需要在 github 上跟踪更改(当引入 MONO_X509_REVOCATION_MODE 时)并检查版本包含该提交的分支。
    • 谢谢,github.com/mono/mono/commit/… 所以 2.8 包含这个
    【解决方案2】:
    public class TrustAllCertificatePolicy : System.Net.ICertificatePolicy
    {
         public TrustAllCertificatePolicy() {}
         public bool CheckValidationResult(ServicePoint sp, 
             X509Certificate cert,
             WebRequest req, 
             int problem)
         {
            return true;
         }
    }
    

    所以在与远程服务器建立 HTTPS 连接(通过 WebRequest、WebServices 或其他方式)之前,只需调用:

    System.Net.ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy();
    

    享受

    【讨论】:

      【解决方案3】:

      如果您在单声道中使用 ASP,则需要使用用户 www-data 下载并安装 Mozilla 的根证书

      chown www-data /var/www/
      sudo -u www-data mozroots --import --sync
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-26
        • 1970-01-01
        • 2017-09-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多