メニュー
Amazon Simple Storage Service
開発者ガイド (API Version 2006-03-01)

.NET SDK を使用したお客様が用意した暗号化キーによるサーバー側の暗号化の指定

次の C# コード例では、お客様が用意したキーによるサーバー側の暗号化(SSE-C)を示しています(「お客様が用意した暗号化キーによるサーバー側の暗号化(SSE-C)を使用したデータの保護」を参照)。この例では以下のオペレーションを実行します。各オペレーションは、リクエスト内で SSE-C 関連のヘッダーを指定する方法を示しています。

  • Put object – お客様が用意した暗号キーによるサーバー側の暗号化をリクエストしてオブジェクトをアップロードします。

  • Get object – 前のステップでアップロードしたオブジェクトをダウンロードします。Amazon S3 がオブジェクトを復号してお客様に返すことができるようにするには、リクエストで同じ暗号化情報を指定する必要があることを示しています。

  • Get object metadata – このリクエストは、オブジェクトメタデータを取得するには、オブジェクトを作成したときに指定したものと同じ暗号化情報が必要であることを示しています。

  • Copy object – この例は、以前にアップロードしたオブジェクトのコピーを作成します。ソースオブジェクトは SSE-C を使用して保存されているため、コピーリクエストで暗号化情報を提供する必要があります。デフォルトでは、オブジェクトのコピーは暗号化されません。ただし、この例では、オブジェクトのコピーを SSE-C を使用して暗号化して保存することを Amazon S3 にリクエストしているため、ターゲットについても暗号化関連情報も提供しています。

注記

マルチパートアップロード API を使用して大きなオブジェクトをアップロードするときには、前の例に示されているようにリクエストで提供したものと同じ暗号化情報を提供します。マルチパートアップロードの .NET SDK の例については、「AWS .NET SDK を使用したマルチパートアップロード (高レベル API)」と「AWS .NET SDK を使用したマルチパートアップロード (低レベル API)」を参照してください。

作業サンプルを作成およびテストする方法については、「Amazon S3 .NET コード例の実行」を参照してください。

Copy
using System; using System.IO; using System.Security.Cryptography; using Amazon.S3; using Amazon.S3.Model; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace s3.amazon.com.docsamples { class SSEClientEncryptionKeyObjectOperations { static string bucketName = "*** bucket name ***"; static string keyName = "*** object key name for new object ***"; static string copyTargetKeyName = "*** copy operation target object key name ***"; static IAmazonS3 client; public static void Main(string[] args) { using (client = new AmazonS3Client(Amazon.RegionEndpoint.USWest2)) { try { // Create encryption key. Aes aesEncryption = Aes.Create(); aesEncryption.KeySize = 256; aesEncryption.GenerateKey(); string base64Key = Convert.ToBase64String(aesEncryption.Key); // 1. Upload object. PutObjectRequest putObjectRequest = UploadObject(base64Key); // 2. Download object (and also verify content is same as what you uploaded). DownloadObject(base64Key, putObjectRequest); // 3. Get object metadata (and also verify AES256 encryption). GetObjectMetadata(base64Key); // 4. Copy object (both source and target objects use server-side encryption with // customer-provided encryption key. CopyObject(aesEncryption, base64Key); } catch (AmazonS3Exception amazonS3Exception) { if (amazonS3Exception.ErrorCode != null && (amazonS3Exception.ErrorCode.Equals("InvalidAccessKeyId") || amazonS3Exception.ErrorCode.Equals("InvalidSecurity"))) { Console.WriteLine("Check the provided AWS Credentials."); Console.WriteLine( "For service sign up go to http://aws.amazon.com/s3"); } else { Console.WriteLine( "Error occurred. Message:'{0}' when writing an object" , amazonS3Exception.Message); } } } Console.WriteLine("Press any key to continue..."); Console.ReadKey(); } private static void CopyObject(Aes aesEncryption, string base64Key) { aesEncryption.GenerateKey(); string copyBase64Key = Convert.ToBase64String(aesEncryption.Key); CopyObjectRequest copyRequest = new CopyObjectRequest { SourceBucket = bucketName, SourceKey = keyName, DestinationBucket = bucketName, DestinationKey = copyTargetKeyName, // Source object encryption information. CopySourceServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256, CopySourceServerSideEncryptionCustomerProvidedKey = base64Key, // Target object encryption information. ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256, ServerSideEncryptionCustomerProvidedKey = copyBase64Key }; client.CopyObject(copyRequest); } private static void DownloadObject(string base64Key, PutObjectRequest putObjectRequest) { GetObjectRequest getObjectRequest = new GetObjectRequest { BucketName = bucketName, Key = keyName, // Provide encryption information of the object stored in S3. ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256, ServerSideEncryptionCustomerProvidedKey = base64Key }; using (GetObjectResponse getResponse = client.GetObject(getObjectRequest)) using (StreamReader reader = new StreamReader(getResponse.ResponseStream)) { string content = reader.ReadToEnd(); Assert.AreEqual(putObjectRequest.ContentBody, content); Assert.AreEqual(ServerSideEncryptionCustomerMethod.AES256, getResponse.ServerSideEncryptionCustomerMethod); } } private static void GetObjectMetadata(string base64Key) { GetObjectMetadataRequest getObjectMetadataRequest = new GetObjectMetadataRequest { BucketName = bucketName, Key = keyName, // Object stored in S3 is encrypted. So provide necessary encryption information. ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256, ServerSideEncryptionCustomerProvidedKey = base64Key }; GetObjectMetadataResponse getObjectMetadataResponse = client.GetObjectMetadata(getObjectMetadataRequest); Assert.AreEqual(ServerSideEncryptionCustomerMethod.AES256, getObjectMetadataResponse.ServerSideEncryptionCustomerMethod); } private static PutObjectRequest UploadObject(string base64Key) { PutObjectRequest putObjectRequest = new PutObjectRequest { BucketName = bucketName, Key = keyName, ContentBody = "sample text", ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256, ServerSideEncryptionCustomerProvidedKey = base64Key }; PutObjectResponse putObjectResponse = client.PutObject(putObjectRequest); return putObjectRequest; } } }

その他の Amazon S3 オペレーションと SSE-C

前のセクションの例では、PUT、GET、Head、および COPY オペレーションで、お客様が用意したキーによるサーバー側の暗号化(SSE-C)をリクエストする方法を示しています。このセクションでは、SSE-C をサポートするその他の API について説明します。

大きなオブジェクトをアップロードするために、マルチパートアップロード API を使用できます(「Multipart Upload API を使用したオブジェクトのアップロード」を参照)。高レベル API または低レベル API を使用して、大きなオブジェクトをアップロードできます。これらの API は、リクエストでの暗号化関連のヘッダーをサポートします。

  • 高レベルの転送ユーティリティ API を使用するときには、次に示すように TransferUtilityUploadRequest で暗号化固有のヘッダーを提供します。コード例については、「AWS .NET SDK を使用したマルチパートアップロード (高レベル API)」を参照してください。

    Copy
    TransferUtilityUploadRequest request = new TransferUtilityUploadRequest() { FilePath = filePath, BucketName = existingBucketName, Key = keyName, // Provide encryption information. ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256, ServerSideEncryptionCustomerProvidedKey = base64Key, };
  • 低レベル API を使用する場合は、マルチパートアップロードの開始リクエストで暗号化関連情報を提供し、以降のパートのアップロードリクエストでは同じ暗号化情報を提供します。マルチパートアップロードの完了リクエストでは、暗号化固有のヘッダーを提供する必要はありません。例については、「AWS .NET SDK を使用したマルチパートアップロード (低レベル API)」を参照してください。

    既存の大きなオブジェクトをコピーする低レベルのマルチパートアップロードの例を次に示します。この例では、コピーされるオブジェクトは SSE-C を使用して Amazon S3 に格納されており、ターゲットオブジェクトも SSE-C を使用して保存します。この例では、次の処理を行います。

    • 暗号化キーと関連情報を提供することによって、マルチパートアップロードのリクエストを開始します。

    • CopyPartRequest でソースオブジェクトとターゲットオブジェクトの暗号化キーを提供します。

    • オブジェクトメタデータを取得することによって、コピーされるソースオブジェクトのサイズを取得します。

    • 5 MB のパート単位でオブジェクトをアップロードします。

    Copy
    using System; using System.Collections.Generic; using System.Security.Cryptography; using Amazon.S3; using Amazon.S3.Model; namespace s3.amazon.com.docsamples { class SSECLowLevelMPUcopyObject { static string existingBucketName = "*** bucket name ***"; static string sourceKeyName = "*** key name ***"; static string targetKeyName = "*** key name ***"; static void Main(string[] args) { IAmazonS3 s3Client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1); List<CopyPartResponse> uploadResponses = new List<CopyPartResponse>(); Aes aesEncryption = Aes.Create(); aesEncryption.KeySize = 256; aesEncryption.GenerateKey(); string base64Key = Convert.ToBase64String(aesEncryption.Key); // 1. Initialize. InitiateMultipartUploadRequest initiateRequest = new InitiateMultipartUploadRequest { BucketName = existingBucketName, Key = targetKeyName, ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256, ServerSideEncryptionCustomerProvidedKey = base64Key, }; InitiateMultipartUploadResponse initResponse = s3Client.InitiateMultipartUpload(initiateRequest); // 2. Upload Parts. long partSize = 5 * (long)Math.Pow(2, 20); // 5 MB long firstByte = 0; long lastByte = partSize; try { // First find source object size. Because object is stored encrypted with // customer provided key you need to provide encryption information in your request. GetObjectMetadataRequest getObjectMetadataRequest = new GetObjectMetadataRequest() { BucketName = existingBucketName, Key = sourceKeyName, ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256, ServerSideEncryptionCustomerProvidedKey = "***source object encryption key ***" }; GetObjectMetadataResponse getObjectMetadataResponse = s3Client.GetObjectMetadata(getObjectMetadataRequest); long filePosition = 0; for (int i = 1; filePosition < getObjectMetadataResponse.ContentLength; i++) { CopyPartRequest copyPartRequest = new CopyPartRequest { UploadId = initResponse.UploadId, // Source. SourceBucket = existingBucketName, SourceKey = sourceKeyName, // Source object is stored using SSE-C. Provide encryption information. CopySourceServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256, CopySourceServerSideEncryptionCustomerProvidedKey = "***source object encryption key ***", FirstByte = firstByte, // If the last part is smaller then our normal part size then use the remaining size. LastByte = lastByte > getObjectMetadataResponse.ContentLength ? getObjectMetadataResponse.ContentLength - 1 : lastByte, // Target. DestinationBucket = existingBucketName, DestinationKey = targetKeyName, PartNumber = i, // Ecnryption information for the target object. ServerSideEncryptionCustomerMethod = ServerSideEncryptionCustomerMethod.AES256, ServerSideEncryptionCustomerProvidedKey = base64Key }; uploadResponses.Add(s3Client.CopyPart(copyPartRequest)); filePosition += partSize; firstByte += partSize; lastByte += partSize; } // Step 3: complete. CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest { BucketName = existingBucketName, Key = targetKeyName, UploadId = initResponse.UploadId, }; completeRequest.AddPartETags(uploadResponses); CompleteMultipartUploadResponse completeUploadResponse = s3Client.CompleteMultipartUpload(completeRequest); } catch (Exception exception) { Console.WriteLine("Exception occurred: {0}", exception.Message); AbortMultipartUploadRequest abortMPURequest = new AbortMultipartUploadRequest { BucketName = existingBucketName, Key = targetKeyName, UploadId = initResponse.UploadId }; s3Client.AbortMultipartUpload(abortMPURequest); } } } }