0

我正在使用 Amazon C# SDK 版本 1.5.36.0。我创建了一个类来将文件上传到 Amazon S3,在我的机器上它工作得很好,完全没有错误,但是当我在生产服务器中运行它时,我收到以下错误:“底层连接已关闭:无法建立SSL/TLS 安全通道的信任关系。”

我在下面粘贴我提到的一段代码:

public bool SaveFile(S3Folder folder, string customFolder, string fileName, Stream stream, bool publicFile)
    {
        // Validações
        if (string.IsNullOrEmpty(fileName) || stream == null)
            return false;

        using (var s3Client = new AmazonS3Client(accessKey, secretKey, region))
        {
            var request = new PutObjectRequest();
            request.BucketName = bucketName;
            request.InputStream = stream;

            if (!string.IsNullOrEmpty(customFolder))
                request.Key = GetFolder(folder) + "/" + customFolder + "/" + fileName;
            else
                request.Key = GetFolder(folder) + "/" + fileName;

            if (!publicFile)
                request.CannedACL = S3CannedACL.Private;
            else
                request.CannedACL = S3CannedACL.PublicRead;

            s3Client.PutObject(request);

            return true;
        }
    }

这是我课堂上保存文件的一种方法。S3Folder 是一个枚举,GetFolder 只返回一个带有文件夹名称的字符串。

你们能帮帮我吗?我一直在寻找它,但还没有答案解决我的问题。

提前致谢。

4

2 回答 2

2

我已经解决了。我在创建客户端时将其设置为 http。见下面的代码:

public bool SaveFile(S3Folder folder, string customFolder, string fileName, Stream stream, bool publicFile)
    {
        // Validações
        if (string.IsNullOrEmpty(fileName) || stream == null)
            return false;

        AmazonS3Config S3Config = new AmazonS3Config()
        {
            ServiceURL = "s3.amazonaws.com",
            CommunicationProtocol = Protocol.HTTP,
            RegionEndpoint = region
        };

        using (var s3Client = new AmazonS3Client(accessKey, secretKey, S3Config))
        {

            var request = new PutObjectRequest();
            request.BucketName = bucketName;
            request.InputStream = stream;

            if (!string.IsNullOrEmpty(customFolder))
                request.Key = GetFolder(folder) + "/" + customFolder + "/" + fileName;
            else
                request.Key = GetFolder(folder) + "/" + fileName;

            if (!publicFile)
                request.CannedACL = S3CannedACL.Private;
            else
                request.CannedACL = S3CannedACL.PublicRead;

            s3Client.PutObject(request);

            return true;
        }
    }
于 2013-11-06T15:41:13.350 回答
0

如果您在 S3Config 中设置 ForcePathStyle = true,则可以坚持使用 HTTPS,而不是将 CommunicationProtocol 设置为损害安全性的 HTTP。(这至少需要 AWSSDK.dll 的 2.0.13.0 版本。)

需要这样做的原因在这里得到了很好的解释:http: //shlomoswidler.com/2009/08/amazon-s3-gotcha-using-virtual-host.html。简而言之,S3 支持两种版本的对象路径,一种像

https://s3.amazonaws.com/mybucket.mydomain.com/myObjectKey

还有一个喜欢

https://mybucket.mydomain.com.s3.amazonaws.com/myObjectKey

第二种形式,默认使用,会导致安全证书出现问题;ForcePathStyle 使 S3Client 使用第一种形式。

于 2014-04-02T21:45:29.087 回答