

# Usar a criptografia do lado do servidor com chaves gerenciadas pelo Amazon S3 (SSE-S3)
<a name="UsingServerSideEncryption"></a>

**Importante**  
O Amazon S3 agora aplica criptografia do lado do servidor com chaves gerenciadas do Amazon S3 (SSE-S3) como nível básico de criptografia para cada bucket no Amazon S3. Desde 5 de janeiro de 2023, todos os novos uploads de objetos para o Amazon S3 são automaticamente criptografados sem custo adicional e sem impacto na performance. O status de criptografia automática para a configuração de criptografia padrão do bucket do S3 e para novos uploads de objetos está disponível em logs do CloudTrail, no Inventário S3, na Lente de Armazenamento do S3, no console do Amazon S3 e como cabeçalho adicional de resposta da API do Amazon S3 na AWS CLI e em SDKs da AWS. Para obter mais informações, consulte [Perguntas frequentes sobre criptografia padrão](https://docs.aws.amazon.com/AmazonS3/latest/userguide/default-encryption-faq.html).

Todos os uploads de novos objetos para buckets do Amazon S3 são criptografados por padrão com criptografia do lado do servidor com chaves gerenciadas pelo Amazon S3 (SSE-S3).

A criptografia no lado do servidor protege dados em repouso. O Amazon S3 criptografa cada objeto com uma chave exclusiva. Como uma proteção adicional, ela criptografa a si mesma utilizando uma chave que alterna regularmente. A criptografia do lado do servidor do Amazon S3 usa o Advanced Encryption Standard Galois/Counter Mode (AES-GCM) de 256 bits para criptografar todos os objetos carregados.

Não existem taxas adicionais pelo uso da criptografia do lado do servidor com chaves gerenciadas pelo Amazon S3 (SSE-S3). Mas, as solicitações de configuração do recurso de criptografia padrão geram os encargos de solicitação padrão do Amazon S3. Para obter mais informações sobre preços, consulte [Preços do Amazon S3](https://aws.amazon.com/s3/pricing/).

Se você precisar que os uploads de dados sejam criptografados usando somente chaves gerenciadas pelo Amazon S3, poderá usar a política de bucket a seguir. Por exemplo, a política de bucket a seguir negará permissões para fazer upload de um objeto, a menos que a solicitação não inclua o cabeçalho `x-amz-server-side-encryption` a fim de solicitar criptografia no lado do servidor:

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Id": "PutObjectPolicy",
  "Statement": [
    {
      "Sid": "DenyObjectsThatAreNotSSES3",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
      "Condition": {
        "StringNotEquals": {
          "s3:x-amz-server-side-encryption": "AES256"
        }
      }
    }
   ]
}
```

------

**nota**  
A criptografia no lado do servidor criptografa somente os dados de objeto, não os metadados de objeto. 

## Suporte de API para criptografia do lado do servidor
<a name="APISupportforServer-SideEncryption"></a>

Todos os buckets do Amazon S3 têm criptografia configurada por padrão e todos os novos objetos que são carregados em um bucket do S3 são automaticamente criptografados em repouso. A criptografia do lado do servidor com chaves gerenciadas pelo Amazon S3 (SSE-S3) é a configuração de criptografia padrão para todos os buckets no Amazon S3. Para usar um tipo diferente de criptografia, você pode especificar a criptografia do lado do servidor a ser usada nas solicitações `PUT` do S3 ou atualizar a configuração de criptografia padrão no bucket de destino. 

Se quiser especificar um tipo de criptografia diferente nas solicitações `PUT`, você pode usar a criptografia do lado do servidor com chaves do AWS Key Management Service (AWS KMS) (SSE-KMS), criptografia de camada dupla do lado do servidor com chaves do AWS KMS (DSSE-KMS) ou criptografia do lado do servidor com chaves fornecidas pelo cliente (SSE-C). Se quiser definir uma configuração de criptografia padrão diferente no bucket de destino, você pode usar SSE-KMS ou DSSE-KMS.

Para ter mais informações sobre a alteração da configuração padrão de criptografia para buckets de uso geral, consulte [Configurar a criptografia padrão](default-bucket-encryption.md). 

Quando você altera a configuração de criptografia padrão do bucket para SSE-KMS, o tipo de criptografia dos objetos do Amazon S3 existentes no bucket não é alterado. Para alterar o tipo de criptografia de objetos preexistentes depois de atualizar a configuração padrão de criptografia para SSE-KMS, use o recurso Operações em Lote do Amazon S3. Basta fornecer uma lista de objetos ao recurso Operações em Lote do S3 para que ele chame a respectiva operação de API. É possível usar a ação [Copiar objetos](batch-ops-copy-object.md) para copiar objetos existentes, gravando-os de volta no mesmo bucket que os objetos criptografados por SSE-KMS. Um único trabalho do Batch Operations pode realizar a operação especificada em bilhões de objetos. Para ter mais informações, consulte [Executar operações de objetos em massa com o Operações em Lote](batch-ops.md) e a publicação [How to retroactively encrypt existing objects in Amazon S3 using S3 Inventory, Amazon Athena, and S3 Batch Operations](https://aws.amazon.com/blogs/security/how-to-retroactively-encrypt-existing-objects-in-amazon-s3-using-s3-inventory-amazon-athena-and-s3-batch-operations/) do *Blog do AWS Storage*. 

Para configurar a criptografia do lado do servidor usando as APIs REST de criação de objetos, é necessário fornecer o cabeçalho de solicitação `x-amz-server-side-encryption`. Para obter informações sobre as APIs REST, consulte [Uso da API REST](specifying-s3-encryption.md#SSEUsingRESTAPI).

As APIs do Amazon S3 a seguir são compatíveis com este cabeçalho:
+ **Operações PUT**: especifique o cabeçalho de solicitação ao fazer upload de dados usando a API `PUT`. Para obter mais informações, consulte [Objeto PUT](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html).
+ **Iniciar upload de várias partes**: especifique o cabeçalho na solicitação de inicialização ao fazer upload de objetos grandes usando a operação de API de upload de várias partes. Para obter mais informações, consulte [Iniciar Multipart Upload](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadInitiate.html).
+ **Operações COPY**: quando você copia um objeto, tem um objeto de origem e um objeto de destino. Para obter mais informações, consulte [Objeto PUT - Copiar](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html).

**nota**  
Ao usar uma operação `POST` para fazer upload de um objeto, em vez de fornecer o cabeçalho de solicitação, você fornece as mesmas informações nos campos de formulário. Para obter mais informações, consulte [Objeto POST](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html). 

Os AWS SDKs também fornecem APIs de wrapper que você pode usar para solicitar criptografia no lado do servidor. Você também pode usar o Console de gerenciamento da AWS para fazer upload de objetos e solicitar a criptografia no lado do servidor.

Para obter mais informações gerais, consulte [Conceitos do AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html) no *Guia do desenvolvedor do AWS Key Management Service*.

**Topics**
+ [

## Suporte de API para criptografia do lado do servidor
](#APISupportforServer-SideEncryption)
+ [

# Especificar a criptografia do lado do servidor com chaves gerenciadas pelo Amazon S3 (SSE-S3)
](specifying-s3-encryption.md)

# Especificar a criptografia do lado do servidor com chaves gerenciadas pelo Amazon S3 (SSE-S3)
<a name="specifying-s3-encryption"></a>

Todos os buckets do Amazon S3 têm criptografia configurada por padrão e todos os novos objetos que são carregados em um bucket do S3 são automaticamente criptografados em repouso. A criptografia do lado do servidor com chaves gerenciadas pelo Amazon S3 (SSE-S3) é a configuração de criptografia padrão para todos os buckets no Amazon S3. Para usar um tipo diferente de criptografia, você pode especificar a criptografia do lado do servidor a ser usada nas solicitações `PUT` do S3 ou atualizar a configuração de criptografia padrão no bucket de destino. 

Se quiser especificar um tipo de criptografia diferente nas solicitações `PUT`, você pode usar a criptografia do lado do servidor com chaves do AWS Key Management Service (AWS KMS) (SSE-KMS), criptografia de camada dupla do lado do servidor com chaves do AWS KMS (DSSE-KMS) ou criptografia do lado do servidor com chaves fornecidas pelo cliente (SSE-C). Se quiser definir uma configuração de criptografia padrão diferente no bucket de destino, você pode usar SSE-KMS ou DSSE-KMS.

Para ter mais informações sobre a alteração da configuração padrão de criptografia para buckets de uso geral, consulte [Configurar a criptografia padrão](default-bucket-encryption.md). 

Quando você altera a configuração de criptografia padrão do bucket para SSE-KMS, o tipo de criptografia dos objetos do Amazon S3 existentes no bucket não é alterado. Para alterar o tipo de criptografia de objetos preexistentes depois de atualizar a configuração padrão de criptografia para SSE-KMS, use o recurso Operações em Lote do Amazon S3. Basta fornecer uma lista de objetos ao recurso Operações em Lote do S3 para que ele chame a respectiva operação de API. É possível usar a ação [Copiar objetos](batch-ops-copy-object.md) para copiar objetos existentes, gravando-os de volta no mesmo bucket que os objetos criptografados por SSE-KMS. Um único trabalho do Batch Operations pode realizar a operação especificada em bilhões de objetos. Para ter mais informações, consulte [Executar operações de objetos em massa com o Operações em Lote](batch-ops.md) e a publicação [How to retroactively encrypt existing objects in Amazon S3 using S3 Inventory, Amazon Athena, and S3 Batch Operations](https://aws.amazon.com/blogs/security/how-to-retroactively-encrypt-existing-objects-in-amazon-s3-using-s3-inventory-amazon-athena-and-s3-batch-operations/) do *Blog do AWS Storage*. 

Você pode especificar o SSE-S3 usando o console do S3, APIs REST, AWS SDKs e a AWS Command Line Interface (AWS CLI). Para obter mais informações, consulte [Definir o comportamento padrão da criptografia para os buckets do Amazon S3](bucket-encryption.md).

## Usar o console do S3
<a name="add-object-encryption-s3"></a>

Este tópico descreve como definir ou alterar o tipo de criptografia de um objeto usando o Console de gerenciamento da AWS. Ao copiar um objeto usando o console, o Amazon S3 copia o objeto como está. Isso significa que se o objeto de origem é criptografado, o objeto de destino também será criptografado. É possível usar o console para adicionar ou alterar a criptografia para um objeto. 

**nota**  
Você pode alterar a criptografia de um objeto se ele tiver menos de 5 GB. Se o objeto tiver mais de 5 GB, você deve usar a [AWS CLI](mpu-upload-object.md#UsingCLImpUpload) ou [SDKs da AWS](CopyingObjectsMPUapi.md) para alterar a criptografia de um objeto.
Para obter uma lista das permissões adicionais necessárias para alterar a criptografia de um objeto, consulte [Permissões obrigatórias para operações de API do Amazon S3](using-with-s3-policy-actions.md). Para ver exemplos das políticas que concedem essas permissões, consulte [Exemplos de políticas baseadas em identidade para o Amazon S3](example-policies-s3.md).
Se você alterar a criptografia de um objeto, um novo objeto será criado para substituir o antigo. Se o versionamento do S3 estiver habilitado, uma nova versão do objeto será criada e o objeto existente se tornará uma versão mais antiga. O perfil que altera a propriedade também se torna o proprietário do novo objeto (ou versão do objeto). 

**Para alterar a criptografia de um objeto**

1. Faça login no Console de gerenciamento da AWS e abra o console do Amazon S3 em [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/).

1. No painel de navegação, escolha **Buckets** e selecione a guia **Buckets de uso geral**. Acesse o bucket ou pasta do Amazon S3 que contém os objetos que você quer alterar.

1. Marque a caixa de seleção referente aos objetos que você quer alterar.

1. No menu **Ações**, escolha **Editar criptografia no lado do servidor** na lista de opções exibida.

1. Role até a seção **Criptografia do lado do servidor.**

1. Em **Configurações de criptografia**, escolha **Usar configurações de bucket para criptografia padrão** ou **Substituir configurações de bucket para criptografia padrão**.

1. Se você escolher **Substituir configurações do bucket para criptografia padrão**, defina as configurações de criptografia a seguir.

   1. Em **Tipo de criptografia**, escolha **Criptografia do lado do servidor com chaves de criptografia gerenciadas pelo Amazon S3 (SSE-S3)**. A SSE-S3 usa uma das criptografias de bloco mais fortes: o padrão de criptografia avançada de 256 bits (AES-256) para criptografar cada objeto. Para obter mais informações, consulte [Usar a criptografia do lado do servidor com chaves gerenciadas pelo Amazon S3 (SSE-S3)](UsingServerSideEncryption.md).

1. Em **Configurações adicionais de cópia**, escolha se você quer **Copiar configurações de origem**, **Não especificar configurações** ou **Especificar configurações**. **Copiar configurações de origem** é a opção padrão. Se você quiser copiar o objeto somente sem os atributos das configurações de origem, escolha **Não especificar configurações**. Escolha **Especificar configurações** para especificar configurações referentes a classes de armazenamento, ACLs, tags de objeto, metadados, criptografia do lado do servidor e somas de verificação adicionais.

1. Escolha **Salvar alterações**.

**nota**  
Essa ação aplica criptografia a todos os objetos especificados. Ao criptografar pastas, aguarde a conclusão da operação de salvamento antes de adicionar novos objetos à pasta.

## Uso da API REST
<a name="SSEUsingRESTAPI"></a>

No momento da criação do objeto (quando você faz upload de um objeto novo ou faz uma cópia de um objeto existente), é possível especificar se deseja que o Amazon S3 criptografe seus dados com as chaves gerenciadas pelo Amazon S3 (SSE-S3) adicionando o cabeçalho `x-amz-server-side-encryption` à solicitação. Defina o valor do cabeçalho como o algoritmo de criptografia `AES256`, que é compatível com o Amazon S3. O Amazon S3 confirma que o objeto foi armazenado com SSE-S3 retornando o cabeçalho de resposta `x-amz-server-side-encryption`. 

As seguintes operações de APIs de upload REST aceitam o cabeçalho de solicitação `x-amz-server-side-encryption`.
+ [Objeto PUT](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html)
+ [Objeto PUT - Copiar](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html)
+ [Objeto POST](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html)
+ [Iniciar multipart upload](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadInitiate.html)

Ao fazer upload de objetos grandes usando a operação de API de upload de várias partes, você pode especificar a criptografia do lado do servidor adicionando o cabeçalho `x-amz-server-side-encryption` à solicitação Iniciar upload de várias partes. Ao copiar um objeto existente, independentemente de o objeto de origem ser criptografado ou não, o objeto de destino não é criptografado, a menos que você solicite explicitamente a criptografia do lado do servidor.

Os cabeçalhos de resposta das operações de API REST a seguir retornam o cabeçalho `x-amz-server-side-encryption` quando um objeto é armazenado usando SSE-S3. 
+ [Objeto PUT](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html)
+ [Objeto PUT - Copiar](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html)
+ [Objeto POST](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html)
+ [Iniciar multipart upload](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadInitiate.html)
+ [Carregar parte](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadUploadPart.html)
+ [Carregamento de parte: copiar](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadUploadPartCopy.html)
+ [Concluir carregamento fracionado](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadComplete.html)
+ [Objeto Get](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html)
+ [Objeto Head](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectHEAD.html)

**nota**  
Não envie cabeçalhos de solicitação de criptografia para solicitações `GET` e `HEAD` se o objeto usa SSE-S3, ou você receberá um erro 400 (Solicitação inválida) de status HTTP.

## Usar SDKs da AWS
<a name="s3-using-sdks"></a>

Ao usar AWS SDKs, é possível solicitar que o Amazon S3 use criptografia do lado do servidor com chaves de criptografia gerenciadas pelo Amazon S3 (SSE-S3). Esta seção fornece exemplos de uso dos AWS SDKs em várias linguagens. Para obter informações sobre outros SDKs, consulte [Código de exemplo e bibliotecas](https://aws.amazon.com/code). 

------
#### [ Java ]

Ao usar o AWS SDK para Java para fazer upload de um objeto, você pode usar SSE-S3 para criptografá-lo. Para solicitar a criptografia no lado do servidor, use a propriedade `ObjectMetadata` da `PutObjectRequest` para configurar o cabeçalho da solicitação `x-amz-server-side-encryption`. Ao chamar o método `putObject()` do `AmazonS3Client`, o Amazon S3 criptografa e salva os dados.

Você também pode solicitar a criptografia SSE-S3 ao fazer upload de objetos com a operação de API de upload de várias partes: 
+ Ao usar a operação de API de alto nível de upload de várias partes, você usa os métodos `TransferManager` para aplicar criptografia no lado do servidor aos objetos conforme faz upload desses objetos. Você pode usar qualquer um dos métodos de upload que assumem `ObjectMetadata` como um parâmetro. Para obter mais informações, consulte [Fazer upload de um objeto usando multipart upload](mpu-upload-object.md).
+ Ao usar a operação de API de upload de várias partes de baixo nível, você especifica a criptografia de servidor ao iniciar o upload de várias partes. Você adiciona a propriedade `ObjectMetadata` chamando o método `InitiateMultipartUploadRequest.setObjectMetadata()`. Para obter mais informações, consulte [Uso dos AWS SDKs (API de baixo nível)](mpu-upload-object.md#mpu-upload-low-level).

Você não poderá alterar diretamente o estado de criptografia de um objeto (criptografando um objeto não criptografado ou descriptografando um objeto criptografado). Para alterar o estado de criptografia de um objeto, faça uma cópia do objeto, especificando o estado desejado de criptografia para a cópia e, em seguida, exclua o objeto original. O Amazon S3 criptografa o objeto copiado somente se você solicitar explicitamente criptografia no lado do servidor. Para solicitar a criptografia do objeto copiado por meio da API Java, use a propriedade `ObjectMetadata` para especificar a criptografia no lado do servidor na `CopyObjectRequest`.

**Example Exemplo**  
O exemplo a seguir mostra como definir a criptografia do lado do servidor usando o AWS SDK para Java. Ele mostra como executar as seguintes tarefas:  
+ Faça upload de um novo objeto usando SSE-S3.
+ Alterar o estado de criptografia de um objeto (neste exemplo, criptografar um objeto anteriormente não criptografado) fazendo uma cópia do objeto.
+ Verificar o estado de criptografia do objeto.
Para obter mais informações sobre criptografia no lado do servidor, consulte [Uso da API REST](#SSEUsingRESTAPI). Consulte instruções sobre como criar e testar uma amostra funcional em [Getting Started](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/getting-started.html) no Guia do desenvolvedor do AWS SDK para 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 ]

Ao fazer upload de um objeto, você pode instruir o Amazon S3 a criptografar esse objeto. Para alterar o estado de criptografia de um objeto existente, faça uma cópia do objeto e exclua o objeto de origem. Por padrão, a operação de cópia criptografa o destino somente se você solicitar explicitamente a criptografia no lado do servidor do objeto de destino. Para especificar a SSE-S3 no `CopyObjectRequest`, adicione o seguinte:

```
 ServerSideEncryptionMethod = ServerSideEncryptionMethod.AES256
```

Para obter uma amostra funcional de como copiar um objeto, consulte [Usar SDKs da AWS](copy-object.md#CopyingObjectsUsingSDKs). 

O exemplo a seguir faz upload de um objeto. Na solicitação, o exemplo instrui o Amazon S3 a criptografar o objeto. O exemplo então recupera metadados do objeto e verifica o método de criptografia que foi usado. Para obter informações sobre como configurar e executar exemplos de código, consulte [Conceitos básicos do AWS SDK for .NET](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html) no *Guia do desenvolvedor do AWS SDK for .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 ]

Este tópico mostra como usar classes da versão 3 do AWS SDK para PHP para adicionar SSE-S3 a objetos que você carrega no Amazon S3. Para obter mais informações sobre a API do AWS SDK for Ruby, acesse [AWS SDK for Ruby Version 2](https://docs.aws.amazon.com/sdkforruby/api/index.html).

Para fazer upload de um objeto no Amazon S3, use o método [Aws\$1S3\$1S3Client::putObject()](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#putobject). Para adicionar o cabeçalho de solicitação `x-amz-server-side-encryption` à sua solicitação de upload, especifique o parâmetro `ServerSideEncryption` com o valor `AES256`, conforme exibido no seguinte exemplo de código. Para obter informações sobre solicitações de criptografia no lado do servidor, consulte [Uso da API REST](#SSEUsingRESTAPI).

```
 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',
]);
```

Em resposta, o Amazon S3 retorna o cabeçalho `x-amz-server-side-encryption` com o valor do algoritmo de criptografia que foi usado para criptografar os dados de objeto. 

Ao fazer upload de objetos grandes usando a operação de API de upload de várias partes, você pode especificar a SSE-S3 para os objetos que estiver carregando, conforme segue: 
+ Ao usar a operação de API de upload de várias partes de baixo nível, especifique a criptografia do lado do servidor ao chamar o método [Aws\$1S3\$1S3Client::createMultipartUpload()](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#createmultipartupload). Para adicionar o cabeçalho de solicitação `x-amz-server-side-encryption` à sua solicitação, especifique a chave `array` do parâmetro `ServerSideEncryption` com o valor `AES256`. Para obter mais informações sobre a operação de API de upload de várias partes de baixo nível, consulte [Uso dos AWS SDKs (API de baixo nível)](mpu-upload-object.md#mpu-upload-low-level).
+ Ao usar a operação de API de upload de várias partes de alto nível, especifique a criptografia do lado do servidor usando o parâmetro `ServerSideEncryption` da operação de API [CreateMultipartUpload](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#createmultipartupload). Para ver um exemplo de uso do método `setOption()` com a operação de API de upload de várias partes de alto nível, consulte [Fazer upload de um objeto usando multipart upload](mpu-upload-object.md).

Para determinar o estado de criptografia de um objeto existente, recupere os metadados de objeto chamando o método [Aws\$1S3\$1S3Client::headObject()](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#headobject) conforme exibido no seguinte exemplo 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 alterar o estado de criptografia de um objeto existente, faça uma cópia do objeto usando o método [Aws\$1S3\$1S3Client::copyObject()](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#copyobject) e exclua o objeto de origem. Por padrão, o `copyObject()` não criptografará o destino, a menos que você solicite explicitamente a criptografia do lado do servidor do objeto de destino usando o parâmetro `ServerSideEncryption` com o valor `AES256`. O exemplo de código PHP a seguir faz uma cópia de um objeto e adiciona a criptografia no lado do servidor ao 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 saber mais, consulte os seguintes tópicos:
+ [AWS SDK para PHP for Amazon S3, classe Aws\$1S3\$1S3Client](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.S3.S3Client.html) 
+ [AWS SDK para PHP documentação da](https://aws.amazon.com/documentation/sdk-for-php/)

------
#### [ Ruby ]

Ao usar o AWS SDK para Ruby para fazer upload de um objeto, você pode especificar que o objeto seja armazenado criptografado em repouso com a SSE-S3. Ao ler o objeto de volta, ele é descriptografado automaticamente.

O exemplo do AWS SDK para Ruby versão 3 a seguir demonstra como especificar que um arquivo carregado no Amazon S3 seja criptografado em repouso.

```
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__
```

O exemplo de código a seguir demonstra como determinar o estado de criptografia de um 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__
```

Se a criptografia do lado do servidor não for usada para o objeto que é armazenado no Amazon S3, o método retornará `null`.

Para alterar o estado de criptografia de um objeto existente, faça uma cópia do objeto e exclua o objeto de origem. Por padrão, os métodos de cópia não criptografam o destino, a menos que você solicite explicitamente a criptografia no lado do servidor. Você pode solicitar a criptografia do objeto de destino especificando o valor `server_side_encryption` no argumento de hash de opções conforme mostrado no seguinte exemplo de código Ruby. O exemplo de código demonstra como copiar um objeto e criptografar a cópia com 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__
```

------

## Como usar o AWS CLI
<a name="sse-s3-aws-cli"></a>

Para especificar a SSE-S3 ao carregar um objeto usando a AWS CLI, use o exemplo a seguir.

```
aws s3api put-object --bucket amzn-s3-demo-bucket1 --key object-key-name --server-side-encryption AES256  --body file path
```

Para obter mais informações, consulte [put-object](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-object.html) na *referência da AWS CLI*. Para especificar a SSE-S3 ao copiar um objeto usando a AWS CLI, consulte [copy-object](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/copy-object.html).

## Usar o CloudFormation
<a name="ss3-s3-cfn"></a>

Para obter exemplos de configuração de criptografia usando o CloudFormation, consulte os exemplos [Criar um bucket com criptografia padrão](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-serversideencryptionrule.html#aws-properties-s3-bucket-serversideencryptionrule--examples--Create_a_bucket_with_default_encryption) e [Criar um bucket usando criptografia do lado do servidor do AWS KMS com uma Chave de bucket do S3](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-serversideencryptionrule.html#aws-properties-s3-bucket-serversideencryptionrule--examples--Create_a_bucket_using_AWS_KMS_server-side_encryption_with_an_S3_Bucket_Key) no tópico `AWS::S3::Bucket ServerSideEncryptionRule` do *Guia do usuário do AWS CloudFormation*. 