2013-10-24 42 views
0

我正在使用Amazon C#SDK版本1.5.36.0。我創建了一個類將文件上傳到Amazon S3,並且在我的機器上工作得很好,沒有任何錯誤,但是當我在生產服務器上運行它時,出現以下錯誤:「底層連接已關閉:無法建立信任關係爲SSL/TLS安全通道。「Amazon S3 C#SDK「底層連接已關閉:無法建立SSL/TLS安全通道的信任關係。」錯誤

I'm粘貼波紋管的一段代碼,而我是指:

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只是返回一個包含文件夾名稱的字符串。

你們可以幫我嗎?我一直在尋找它,但沒有答案解決我的問題呢。

在此先感謝。

+0

認識到,當試圖訪問服務器上的圖像文件時,我在瀏覽器中收到此消息: 本網站提供的安全證書不是由可信證書頒發機構頒發的。 安全證書問題可能表示試圖欺騙您或攔截您發送給服務器的任何數據。 –

回答

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; 
     } 
    } 
0

而不是設置CommunicationProtocol到HTTP,這損害了安全性,你可以堅持到HTTPS相反,如果你設置ForcePathStyle =在S3Config如此。 (這至少需要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使用第一種形式。

相關問題