- Java
-
Cuando use el AWS SDK for Java para cargar un objeto, puede usar SSE-S3 para cifrarlo. Para solicitar cifrado del lado del servidor utilice la propiedad ObjectMetadata
de la PutObjectRequest
para establecer el encabezado de solicitud x-amz-server-side-encryption
. Cuando llama al método putObject()
del AmazonS3Client
, Amazon S3 cifra y guarda los datos.
También puede solicitar el cifrado SSE-S3 cuando cargue objetos con la operación de la API de carga multiparte:
-
Al usar la operación de la API de carga multiparte de nivel alto, utiliza los métodos TransferManager
para aplicar cifrado del lado del servidor a los objetos a medida que los carga. Puede utilizar cualquier método de carga que tome ObjectMetadata
como parámetro. Para obtener más información, consulte Carga de un objeto con la carga multiparte.
-
Cuando utiliza la operación de la API de carga multiparte de nivel bajo, especifica el cifrado del lado del servidor al iniciar la carga multiparte. Añade la propiedad ObjectMetadata
al llamar al método InitiateMultipartUploadRequest.setObjectMetadata()
. Para obtener más información, consulte Uso de los AWS SDK (API de bajo nivel).
No puede cambiar directamente el estado de cifrado de un objeto (cifrado de un objeto no cifrado o descifrado de un objeto cifrado). Para cambiar el estado de cifrado de un objeto, realice una copia del objeto, especifique el estado de cifrado deseado para la copia y elimine el objeto original. Amazon S3 cifra el objeto copiado solo si solicita explícitamente el cifrado del lado del servidor. Para solicitar el cifrado del objeto copiado por medio de la API de Java, use la propiedad ObjectMetadata
para especificar el cifrado del lado del servidor en la CopyObjectRequest
.
ejemplo Ejemplo
En el siguiente ejemplo se muestra cómo establecer el cifrado del lado del servidor con el AWS SDK for Java. Se muestra cómo realizar las siguientes tareas:
-
Cargue un objeto nuevo mediante SSE-S3.
-
Cambiar el estado de cifrado de un objeto (en este ejemplo, cifrar un objeto que no estaba cifrado anteriormente) copiando el objeto.
-
Comprobar el estado de cifrado del objeto.
Para obtener más información acerca del cifrado del lado del servidor, consulte Uso de la API de REST. Para obtener instrucciones sobre cómo crear y probar una muestra funcional, consulte Introducción en la Guía del desarrollador de AWS SDK for Java.
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
-
Cuando carga un objeto, puede indicar a Amazon S3 que lo cifre. Para cambiar el estado de cifrado de un objeto existente, realice una copia del objeto y elimine el objeto de origen. De forma predeterminada la operación de copia cifra el destino solo si usted solicita explícitamente cifrado del lado del servidor del objeto de destino. Para especificar SSE-S3 en el CopyObjectRequest
, añada lo siguiente:
ServerSideEncryptionMethod = ServerSideEncryptionMethod.AES256
Para obtener una muestra funcional que indica cómo copiar un objeto, consulte Uso de los AWS SDK.
En el siguiente ejemplo se carga un objeto. En la solicitud, el ejemplo indica a Amazon S3 que cifre el objeto. A continuación el ejemplo recupera los metadatos de los objetos y comprueba el método de cifrado que se utilizó. Para obtener información acerca de cómo configurar y ejecutar ejemplos de código, consulte Introducción al SDK de AWS para .NET en la Guía para desarrolladores del SDK de AWS para .NET.
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
-
En este tema se explica cómo usar las clases de la versión 3 de AWS SDK for PHP para agregar SSE-S3 a objetos que cargue a Amazon S3. Para obtener más información acerca de la API del SDK de AWS para Ruby, consulte SDK de AWS para Ruby, versión 2.
Para cargar un objeto en Amazon S3, use el método Aws\S3\S3Client::putObject(). Para añadir el encabezado de solicitud x-amz-server-side-encryption
a su solicitud de carga, especifique el parámetro ServerSideEncryption
con el valor AES256
, como se muestra en el siguiente ejemplo de código. Para obtener información acerca de solicitudes de cifrado del lado del servidor, consulte Uso de la API de REST.
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',
]);
Como respuesta, Amazon S3 devuelve el encabezado x-amz-server-side-encryption
con el valor del algoritmo de cifrado que se utilizó para cifrar los datos del objeto.
Cuando carga objetos grandes con la operación de la API de carga multiparte, puede especificar SSE-S3 para los objetos que está cargando, como sigue:
-
Cuando utilice la operación de la API de carga multiparte de bajo nivel, especifique el cifrado del lado del servidor al llamar al método Aws\S3\S3Client::createMultipartUpload(). Para agregar el encabezado de solicitud x-amz-server-side-encryption
a su solicitud, especifique la clave del parámetro de la array
ServerSideEncryption
con el valor AES256
. Para obtener más información sobre la operación de la API de carga multiparte de bajo nivel, consulte Uso de los AWS SDK (API de bajo nivel).
-
Cuando utilice la operación de la API de carga multiparte de alto nivel, especifique el cifrado del lado del servidor mediante el parámetro ServerSideEncryption
de la operación de la API CreateMultipartUpload. Para ver un ejemplo sobre cómo usar el método setOption()
con la operación de la API de carga multiparte de alto nivel, consulte Carga de un objeto con la carga multiparte.
Para determinar el estado de cifrado de un objeto existente, recupere los metadatos del objeto llamando al método Aws\S3\S3Client::headObject() como se muestra en el siguiente ejemplo de código PHP.
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'];
Para cambiar el estado de cifrado de un objeto existente, realice una copia del objeto con el método Aws\S3\S3Client::copyObject() y elimine el objeto de origen. De forma predeterminada, copyObject()
no cifra el objeto de destino, a menos que solicite de forma explícita el cifrado del lado del servidor con el parámetro ServerSideEncryption
con el valor AES256
. El siguiente ejemplo de código PHP realiza una copia de un objeto y agrega cifrado en el servidor al objeto copiado.
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',
]);
Para obtener más información, consulte los temas siguientes:
- Ruby
-
Si utiliza AWS SDK for Ruby para cargar un objeto, puede especificar que el objeto se almacene cifrado en reposo con SSE-S3. Cuando vuelve a leer el objeto, este se descifra automáticamente.
En el siguiente ejemplo de AWS SDK for Ruby versión 3 se muestra cómo especificar que un archivo cargado en Amazon S3 quede cifrado en reposo.
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__
El siguiente ejemplo de código muestra cómo determinar el estado de cifrado de un objeto existente.
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 no se utiliza el cifrado del lado del servidor para el objeto almacenado en Amazon S3, el método devolverá null
.
Para cambiar el estado de cifrado de un objeto existente, realice una copia del objeto y elimine el objeto de origen. De forma predeterminada, los métodos de copia no cifran el objeto de destino, a menos que solicite de forma explícita el cifrado del lado del servidor. Puede solicitar el cifrado del objeto de destino al especificar el valor server_side_encryption
en el argumento hash de la opción, tal como se muestra en el siguiente código de ejemplo de Ruby. El ejemplo de código muestra cómo copiar un objeto y cifrar la copia con 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__