- Java
-
Lorsque vous utilisez le AWS SDK for Java pour télécharger un objet, vous pouvez utiliser SSE -S3 pour le chiffrer. Pour demander un chiffrement côté serveur, utilisez la propriété ObjectMetadata
de la demande PutObjectRequest
pour définir l'en-tête de demande x-amz-server-side-encryption
. Lorsque vous appelez la méthode putObject()
du AmazonS3Client
, Amazon S3 chiffre et enregistre les données.
Vous pouvez également demander le chiffrement SSE -S3 lors du téléchargement d'objets à l'aide de l'opération de téléchargement partitionné : API
-
Lorsque vous utilisez l'APIopération de téléchargement partitionné de haut niveau, vous utilisez les TransferManager
méthodes permettant d'appliquer le chiffrement côté serveur aux objets lors de leur téléchargement. Vous pouvez utiliser n'importe quelle méthode de chargement qui accepte ObjectMetadata
comme paramètre. Pour de plus amples informations, veuillez consulter Chargement d'un objet à l'aide du chargement partitionné.
-
Lorsque vous utilisez l'APIopération de téléchargement partitionné de bas niveau, vous spécifiez le chiffrement côté serveur lorsque vous lancez le téléchargement partitionné. Vous ajoutez la propriété ObjectMetadata
en appelant la méthode InitiateMultipartUploadRequest.setObjectMetadata()
. Pour plus d’informations, consultez Utilisation du AWS SDKs (bas niveauAPI).
Vous ne pouvez pas modifier directement l'état de chiffrement d'un objet (chiffrer un objet non chiffré ou déchiffrer un objet chiffré). Pour modifier l'état de chiffrement d'un objet, vous effectuez une copie de l'objet, en spécifiant l'état de chiffrement voulu pour la copie, puis supprimez l'objet d'origine. Amazon S3 chiffre l'objet copié uniquement si vous demandez explicitement un chiffrement côté serveur. Pour demander le chiffrement de l'objet copié via JavaAPI, utilisez la ObjectMetadata
propriété pour spécifier le chiffrement côté serveur dans le. CopyObjectRequest
Exemple
L'exemple suivant illustre comment définir le chiffrement côté serveur à l'aide du kit AWS SDK for Java. Il explique comment effectuer les tâches suivantes :
-
Téléchargez un nouvel objet à l'aide de SSE -S3.
-
Modifier l'état de chiffrement d'un objet (dans cet exemple, chiffrer un objet précédemment non chiffré) en effectuant une copie de l'objet.
-
Vérifier l'état de chiffrement de l'objet.
Pour plus d’informations sur le chiffrement côté serveur, consultez À l'aide du REST API. Pour obtenir des instructions sur la création et le test d'un échantillon fonctionnel, voir Getting Started dans le guide du AWS SDK for Java développeur.
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.internal.SSEResultBase;
import com.amazonaws.services.s3.model.*;
import java.io.ByteArrayInputStream;
public class SpecifyServerSideEncryption {
public static void main(String[] args) {
Regions clientRegion = Regions.DEFAULT_REGION;
String bucketName = "*** Bucket name ***";
String keyNameToEncrypt = "*** Key name for an object to upload and encrypt ***";
String keyNameToCopyAndEncrypt = "*** Key name for an unencrypted object to be encrypted by copying ***";
String copiedObjectKeyName = "*** Key name for the encrypted copy of the unencrypted object ***";
try {
AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
.withRegion(clientRegion)
.withCredentials(new ProfileCredentialsProvider())
.build();
// Upload an object and encrypt it with SSE.
uploadObjectWithSSEEncryption(s3Client, bucketName, keyNameToEncrypt);
// Upload a new unencrypted object, then change its encryption state
// to encrypted by making a copy.
changeSSEEncryptionStatusByCopying(s3Client,
bucketName,
keyNameToCopyAndEncrypt,
copiedObjectKeyName);
} catch (AmazonServiceException e) {
// The call was transmitted successfully, but Amazon S3 couldn't process
// it, so it returned an error response.
e.printStackTrace();
} catch (SdkClientException e) {
// Amazon S3 couldn't be contacted for a response, or the client
// couldn't parse the response from Amazon S3.
e.printStackTrace();
}
}
private static void uploadObjectWithSSEEncryption(AmazonS3 s3Client, String bucketName, String keyName) {
String objectContent = "Test object encrypted with SSE";
byte[] objectBytes = objectContent.getBytes();
// Specify server-side encryption.
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(objectBytes.length);
objectMetadata.setSSEAlgorithm(ObjectMetadata.AES_256_SERVER_SIDE_ENCRYPTION);
PutObjectRequest putRequest = new PutObjectRequest(bucketName,
keyName,
new ByteArrayInputStream(objectBytes),
objectMetadata);
// Upload the object and check its encryption status.
PutObjectResult putResult = s3Client.putObject(putRequest);
System.out.println("Object \"" + keyName + "\" uploaded with SSE.");
printEncryptionStatus(putResult);
}
private static void changeSSEEncryptionStatusByCopying(AmazonS3 s3Client,
String bucketName,
String sourceKey,
String destKey) {
// Upload a new, unencrypted object.
PutObjectResult putResult = s3Client.putObject(bucketName, sourceKey, "Object example to encrypt by copying");
System.out.println("Unencrypted object \"" + sourceKey + "\" uploaded.");
printEncryptionStatus(putResult);
// Make a copy of the object and use server-side encryption when storing the
// copy.
CopyObjectRequest request = new CopyObjectRequest(bucketName,
sourceKey,
bucketName,
destKey);
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setSSEAlgorithm(ObjectMetadata.AES_256_SERVER_SIDE_ENCRYPTION);
request.setNewObjectMetadata(objectMetadata);
// Perform the copy operation and display the copy's encryption status.
CopyObjectResult response = s3Client.copyObject(request);
System.out.println("Object \"" + destKey + "\" uploaded with SSE.");
printEncryptionStatus(response);
// Delete the original, unencrypted object, leaving only the encrypted copy in
// Amazon S3.
s3Client.deleteObject(bucketName, sourceKey);
System.out.println("Unencrypted object \"" + sourceKey + "\" deleted.");
}
private static void printEncryptionStatus(SSEResultBase response) {
String encryptionStatus = response.getSSEAlgorithm();
if (encryptionStatus == null) {
encryptionStatus = "Not encrypted with SSE";
}
System.out.println("Object encryption status is: " + encryptionStatus);
}
}
- .NET
-
Lorsque vous chargez un objet, vous pouvez indiquer à Amazon S3 de le chiffrer. Pour modifier l'état de chiffrement d'un objet existant, vous effectuez une copie de l'objet et supprimez l'objet source. Par défaut, l'opération de copie ne chiffre la cible que si vous demandez explicitement un chiffrement côté serveur de l'objet cible. Pour spécifier SSE -S3 dans leCopyObjectRequest
, ajoutez ce qui suit :
ServerSideEncryptionMethod = ServerSideEncryptionMethod.AES256
Pour obtenir un exemple pratique sur la façon de copier un objet, consultez À l'aide du AWS SDKs.
L'exemple suivant permet de charger un objet. Dans la demande, l'exemple indique à Amazon S3 de chiffrer l'objet. L'exemple récupère ensuite les métadonnées de l'objet et vérifie la méthode de chiffrement utilisée. Pour plus d'informations sur la configuration et l'exécution des exemples de code, consultez Getting Started with the AWS SDK for. NETdans le AWS SDKfour. NETGuide du développeur.
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.Threading.Tasks;
namespace Amazon.DocSamples.S3
{
class SpecifyServerSideEncryptionTest
{
private const string bucketName = "*** bucket name ***";
private const string keyName = "*** key name for object created ***";
// Specify your bucket region (an example region is shown).
private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
private static IAmazonS3 client;
public static void Main()
{
client = new AmazonS3Client(bucketRegion);
WritingAnObjectAsync().Wait();
}
static async Task WritingAnObjectAsync()
{
try
{
var putRequest = new PutObjectRequest
{
BucketName = bucketName,
Key = keyName,
ContentBody = "sample text",
ServerSideEncryptionMethod = ServerSideEncryptionMethod.AES256
};
var putResponse = await client.PutObjectAsync(putRequest);
// Determine the encryption state of an object.
GetObjectMetadataRequest metadataRequest = new GetObjectMetadataRequest
{
BucketName = bucketName,
Key = keyName
};
GetObjectMetadataResponse response = await client.GetObjectMetadataAsync(metadataRequest);
ServerSideEncryptionMethod objectEncryption = response.ServerSideEncryptionMethod;
Console.WriteLine("Encryption method used: {0}", objectEncryption.ToString());
}
catch (AmazonS3Exception e)
{
Console.WriteLine("Error encountered ***. Message:'{0}' when writing an object", e.Message);
}
catch (Exception e)
{
Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
}
}
}
}
- PHP
-
Cette rubrique explique comment utiliser les classes de la version 3 de AWS SDK for PHP pour ajouter SSE -S3 aux objets que vous chargez sur Amazon S3. Pour plus d'informations sur le AWS SDK for RubyAPI, rendez-vous sur AWS SDKfor Ruby - Version 2.
Pour charger un objet sur Amazon S3, utilisez la méthode Aws \ S3 \ S3Client : : putObject (). Pour ajouter l'en-tête de demande x-amz-server-side-encryption
à votre demande de chargement, spécifiez le paramètre ServerSideEncryption
avec la valeur AES256
comme illustré dans l'exemple de code suivant. Pour plus d'informations sur les demandes de chiffrement côté serveur, consultez À l'aide du REST API.
require 'vendor/autoload.php';
use Aws\S3\S3Client;
$bucket = '*** Your Bucket Name ***';
$keyname = '*** Your Object Key ***';
// $filepath should be an absolute path to a file on disk.
$filepath = '*** Your File Path ***';
$s3 = new S3Client([
'version' => 'latest',
'region' => 'us-east-1'
]);
// Upload a file with server-side encryption.
$result = $s3->putObject([
'Bucket' => $bucket,
'Key' => $keyname,
'SourceFile' => $filepath,
'ServerSideEncryption' => 'AES256',
]);
En réponse, Amazon S3 renvoie l'en-tête x-amz-server-side-encryption
avec la valeur de l'algorithme de chiffrement qui a été utilisé pour chiffrer les données de l'objet.
Lorsque vous chargez des objets volumineux à l'aide de l'APIopération de téléchargement partitionné, vous pouvez spécifier SSE -S3 pour les objets que vous chargez, comme suit :
-
Lorsque vous utilisez l'APIopération de téléchargement partitionné de bas niveau, spécifiez le chiffrement côté serveur lorsque vous appelez la méthode Aws \ S3 \ S3Client : : (). createMultipartUpload Pour ajouter l'en-tête x-amz-server-side-encryption
à la demande, spécifiez le paramètre array
avec la clé ServerSideEncryption
en lui donnant la valeur AES256
. Pour plus d'informations sur l'APIopération de téléchargement partitionné de bas niveau, consultez. Utilisation du AWS SDKs (bas niveauAPI)
-
Lorsque vous utilisez l'APIopération de téléchargement partitionné de haut niveau, spécifiez le chiffrement côté serveur à l'aide du ServerSideEncryption
paramètre de l'opération. CreateMultipartUploadAPI Pour un exemple d'utilisation de la setOption()
méthode avec l'APIopération de téléchargement partitionné de haut niveau, consultezChargement d'un objet à l'aide du chargement partitionné.
Pour déterminer l'état de chiffrement d'un objet existant, récupérez les métadonnées de l'objet en appelant la méthode Aws \ S3 \ S3Client : : headObject () comme indiqué dans l'exemple de PHP code suivant.
require 'vendor/autoload.php';
use Aws\S3\S3Client;
$bucket = '*** Your Bucket Name ***';
$keyname = '*** Your Object Key ***';
$s3 = new S3Client([
'version' => 'latest',
'region' => 'us-east-1'
]);
// Check which server-side encryption algorithm is used.
$result = $s3->headObject([
'Bucket' => $bucket,
'Key' => $keyname,
]);
echo $result['ServerSideEncryption'];
Pour modifier l'état de chiffrement d'un objet existant, créez une copie de l'objet à l'aide de la méthode Aws \ S3 \ S3Client : : copyObject () et supprimez l'objet source. Par défaut, copyObject()
ne chiffre pas la cible, sauf si vous demandez explicitement un chiffrement côté serveur de l'objet de destination à l'aide du paramètre ServerSideEncryption
avec la valeur AES256
. L'exemple de PHP code suivant crée une copie d'un objet et ajoute un chiffrement côté serveur à l'objet copié.
require 'vendor/autoload.php';
use Aws\S3\S3Client;
$sourceBucket = '*** Your Source Bucket Name ***';
$sourceKeyname = '*** Your Source Object Key ***';
$targetBucket = '*** Your Target Bucket Name ***';
$targetKeyname = '*** Your Target Object Key ***';
$s3 = new S3Client([
'version' => 'latest',
'region' => 'us-east-1'
]);
// Copy an object and add server-side encryption.
$s3->copyObject([
'Bucket' => $targetBucket,
'Key' => $targetKeyname,
'CopySource' => "$sourceBucket/$sourceKeyname",
'ServerSideEncryption' => 'AES256',
]);
Pour plus d’informations, consultez les rubriques suivantes :
- Ruby
-
Lorsque vous utilisez le AWS SDK for Ruby pour télécharger un objet, vous pouvez spécifier que l'objet doit être stocké chiffré au repos avec SSE -S3. Lorsque vous relisez l'objet, il est automatiquement déchiffré.
L'exemple de AWS SDK for Ruby version 3 suivant montre comment spécifier qu'un fichier chargé sur Amazon S3 soit chiffré au repos.
require 'aws-sdk-s3'
# Wraps Amazon S3 object actions.
class ObjectPutSseWrapper
attr_reader :object
# @param object [Aws::S3::Object] An existing Amazon S3 object.
def initialize(object)
@object = object
end
def put_object_encrypted(object_content, encryption)
@object.put(body: object_content, server_side_encryption: encryption)
true
rescue Aws::Errors::ServiceError => e
puts "Couldn't put your content to #{object.key}. Here's why: #{e.message}"
false
end
end
# Example usage:
def run_demo
bucket_name = "amzn-s3-demo-bucket"
object_key = "my-encrypted-content"
object_content = "This is my super-secret content."
encryption = "AES256"
wrapper = ObjectPutSseWrapper.new(Aws::S3::Object.new(bucket_name, object_content))
return unless wrapper.put_object_encrypted(object_content, encryption)
puts "Put your content into #{bucket_name}:#{object_key} and encrypted it with #{encryption}."
end
run_demo if $PROGRAM_NAME == __FILE__
L'exemple de code suivant montre comment déterminer l'état de chiffrement d'un objet existant.
require 'aws-sdk-s3'
# Wraps Amazon S3 object actions.
class ObjectGetEncryptionWrapper
attr_reader :object
# @param object [Aws::S3::Object] An existing Amazon S3 object.
def initialize(object)
@object = object
end
# Gets the object into memory.
#
# @return [Aws::S3::Types::GetObjectOutput, nil] The retrieved object data if successful; otherwise nil.
def object
@object.get
rescue Aws::Errors::ServiceError => e
puts "Couldn't get object #{@object.key}. Here's why: #{e.message}"
end
end
# Example usage:
def run_demo
bucket_name = "amzn-s3-demo-bucket"
object_key = "my-object.txt"
wrapper = ObjectGetEncryptionWrapper.new(Aws::S3::Object.new(bucket_name, object_key))
obj_data = wrapper.get_object
return unless obj_data
encryption = obj_data.server_side_encryption.nil? ? 'no' : obj_data.server_side_encryption
puts "Object #{object_key} uses #{encryption} encryption."
end
run_demo if $PROGRAM_NAME == __FILE__
Si un chiffrement côté serveur n'est pas utilisé pour l'objet stocké dans Amazon S3, la méthode renvoie null
.
Pour modifier l'état de chiffrement d'un objet existant, effectuez une copie de l'objet et supprimez l'objet source. Par défaut, les méthodes de copie ne chiffrent la cible que si vous demandez explicitement un chiffrement côté serveur. Vous pouvez demander le chiffrement de l'objet cible en spécifiant la valeur server_side_encryption
dans l'argument de hachage d'options, comme illustré dans l'exemple de code Ruby suivant. L'exemple de code montre comment copier un objet et chiffrer la copie avec SSE -S3.
require 'aws-sdk-s3'
# Wraps Amazon S3 object actions.
class ObjectCopyEncryptWrapper
attr_reader :source_object
# @param source_object [Aws::S3::Object] An existing Amazon S3 object. This is used as the source object for
# copy actions.
def initialize(source_object)
@source_object = source_object
end
# Copy the source object to the specified target bucket, rename it with the target key, and encrypt it.
#
# @param target_bucket [Aws::S3::Bucket] An existing Amazon S3 bucket where the object is copied.
# @param target_object_key [String] The key to give the copy of the object.
# @return [Aws::S3::Object, nil] The copied object when successful; otherwise, nil.
def copy_object(target_bucket, target_object_key, encryption)
@source_object.copy_to(bucket: target_bucket.name, key: target_object_key, server_side_encryption: encryption)
target_bucket.object(target_object_key)
rescue Aws::Errors::ServiceError => e
puts "Couldn't copy #{@source_object.key} to #{target_object_key}. Here's why: #{e.message}"
end
end
# Example usage:
def run_demo
source_bucket_name = "amzn-s3-demo-bucket1"
source_key = "my-source-file.txt"
target_bucket_name = "amzn-s3-demo-bucket2"
target_key = "my-target-file.txt"
target_encryption = "AES256"
source_bucket = Aws::S3::Bucket.new(source_bucket_name)
wrapper = ObjectCopyEncryptWrapper.new(source_bucket.object(source_key))
target_bucket = Aws::S3::Bucket.new(target_bucket_name)
target_object = wrapper.copy_object(target_bucket, target_key, target_encryption)
return unless target_object
puts "Copied #{source_key} from #{source_bucket_name} to #{target_object.bucket_name}:#{target_object.key} and "\
"encrypted the target with #{target_object.server_side_encryption} encryption."
end
run_demo if $PROGRAM_NAME == __FILE__