

# Veicular conteúdo privado com URLs e cookies assinados
<a name="PrivateContent"></a>

Várias empresas que distribuem conteúdo pela Internet querem restringir o acesso a documentos, dados de negócio, streams de mídia ou conteúdo destinado a usuários selecionados, por exemplo, que pagaram uma taxa. Para fornecer esse conteúdo privado com segurança usando o CloudFront, é possível:
+ Solicitar que os usuários acessem o conteúdo privado usando signed URLs ou signed cookies especiais do CloudFront. 
+ Solicitar que os usuários acessem seu conteúdo usando URLs do CloudFront e não URLs que acessam conteúdo diretamente no servidor de origem (por exemplo, o Amazon S3 ou um servidor HTTP privado). Não é necessário solicitar URLs do CloudFront, mas recomendamos fazer isso para impedir que os usuários ignorem as restrições especificadas em signed URLs ou signed cookies.

Para obter mais informações, consulte [Restringir o acesso a arquivos](private-content-overview.md).

## Como fornecer conteúdo privado
<a name="private-content-task-list"></a>

Para configurar o CloudFront para fornecer conteúdo privado, siga estas etapas:

1. (Opcional, mas recomendado) Solicite que seus usuários acessem o conteúdo apenas pelo CloudFront. O método usado dependerá se você estiver usando o Amazon S3 ou origens personalizadas:
   + **Amazon S3**: consulte [Restringir o acesso a uma origem do Amazon S3](private-content-restricting-access-to-s3.md).
   + **Origem personalizada**: consulte [Restringir o acesso a arquivos em origens personalizadas](private-content-overview.md#forward-custom-headers-restrict-access).

   As origens personalizadas incluem o Amazon EC2, buckets do Amazon S3 configurados como endpoints de site, o Elastic Load Balancing e seus próprios servidores web HTTP.

1. Especifique os *grupos de chaves confiáveis* ou *assinantes confiáveis* que você deseja usar para criar signed URLs ou cookies. Recomendamos que você use grupos de chaves confiáveis. Para obter mais informações, consulte [Especificar os assinantes que podem criar URLs e cookies assinados](private-content-trusted-signers.md).

1. Crie seu aplicativo para responder a solicitações de usuários autorizados com signed URLs ou cabeçalhos `Set-Cookie` que definem signed cookies. Siga as etapas em um dos tópicos abaixo: 
   + [Usar URLs assinados](private-content-signed-urls.md)
   + [Usar cookies assinados](private-content-signed-cookies.md)

   Se você não tiver certeza sobre qual método usar, consulte [Decidir usar URLs ou cookies assinados](private-content-choosing-signed-urls-cookies.md).

**Topics**
+ [Como fornecer conteúdo privado](#private-content-task-list)
+ [Restringir o acesso a arquivos](private-content-overview.md)
+ [Especificar os assinantes que podem criar URLs e cookies assinados](private-content-trusted-signers.md)
+ [Decidir usar URLs ou cookies assinados](private-content-choosing-signed-urls-cookies.md)
+ [Usar URLs assinados](private-content-signed-urls.md)
+ [Usar cookies assinados](private-content-signed-cookies.md)
+ [Comandos do Linux e OpenSSL para criptografia e codificação base64](private-content-linux-openssl.md)
+ [Exemplos de código para criar uma assinatura para um signed URL](PrivateCFSignatureCodeAndExamples.md)

# Restringir o acesso a arquivos
<a name="private-content-overview"></a>

É possível controlar o acesso do usuário ao seu conteúdo privado de duas maneiras:
+ [Restringir o acesso a arquivos em caches do CloudFront](#private-content-overview-edge-caches).
+ Restrinja o acesso a arquivos na sua origem de uma das seguintes maneiras:
  + [Configure um controle de acesso à origem (OAC) para seu bucket do Amazon S](private-content-restricting-access-to-s3.md).
  + [Configurar cabeçalhos personalizados para um servidor HTTP privado (uma origem personalizada)](#forward-custom-headers-restrict-access).

## Restringir o acesso a arquivos em caches do CloudFront
<a name="private-content-overview-edge-caches"></a>

É possível configurar o CloudFront para exigir que os usuários acessem seus arquivos usando *signed URLs* ou *signed cookies*. Depois, desenvolva sua aplicação para criar e distribuir signed URLs para usuários autenticados ou para enviar cabeçalhos `Set-Cookie` que definem signed cookies para usuários autenticados. (Para conceder a alguns usuários acesso de longo prazo a um pequeno número de arquivos, você também pode criar URLs assinados manualmente.) 

Ao criar signed URLs ou cookies para controlar o acesso a seus arquivos, você pode especificar as seguintes restrições:
+ Uma data e hora de expiração do URL. 
+ (Opcional) A data e a hora em que o URL se torna válido.
+ (Opcional) O endereço IP ou os endereços dos computadores que podem ser usados para acessar seu conteúdo. 

É adicionado hash ou assinatura a parte de um signed URL ou signed cookie usando a chave privada de um par de chaves públicas/privadas. Quando alguém usa um signed URL ou signed cookie para acessar um arquivo, o CloudFront compara as partes assinada e não assinada do URL ou cookie. Se elas não corresponderem, o CloudFront não fornecerá o arquivo.

É necessário usar chaves privadas RSA 2048 ou ECDSA 256 para assinar URLs ou cookies.

## Restringir o acesso a arquivos em buckets do Amazon S3
<a name="private-content-overview-s3"></a>

Também é possível proteger o conteúdo no bucket do Amazon S3 para que os usuários possam acessá-lo por meio da distribuição especificada do CloudFront, mas não possam acessá-lo diretamente usando URLs do Amazon S3. Isso impede que alguém ignore o CloudFront e use o URL do Amazon S3 para obter o conteúdo ao qual você deseja restringir o acesso. Essa etapa não exige o uso de signed URLs, mas recomendamos que você o faça.

Para solicitar que os usuários acessem seu conteúdo por URLs do CloudFront, siga estas etapas:
+ Conceda uma permissão de *controle de acesso à origem* do CloudFront para ler os arquivos no bucket do S3.
+ Crie o controle de acesso à origem e associe-o à sua distribuição do CloudFront.
+ Remova a permissão para usar URLs do Amazon S3 para ler os arquivos de todas as demais pessoas.

Para obter mais informações, consulte [Restringir o acesso a uma origem do Amazon S3](private-content-restricting-access-to-s3.md).

## Restringir o acesso a arquivos em origens personalizadas
<a name="forward-custom-headers-restrict-access"></a>

Se você usar uma origem personalizada, pode configurar os cabeçalhos personalizados para restringir o acesso. Para o CloudFront obter seus arquivos de uma origem personalizada, os arquivos devem estar acessíveis pelo CloudFront usando uma solicitação padrão HTTP (ou HTTPS). Mas, ao usar cabeçalhos personalizados, é possível restringir ainda mais o acesso ao conteúdo para que os usuários possam acessá-lo apenas por meio do CloudFront, e não diretamente. Essa etapa não exige o uso de signed URLs, mas recomendamos que você o faça.

Para exigir que os usuários acessem o conteúdo por meio do CloudFront, altere as seguintes configurações em suas distribuições do CloudFront:

**Cabeçalhos personalizados de origem**  
Configure o CloudFront para encaminhar cabeçalhos personalizados para sua origem. Consulte [Configurar o CloudFront para adicionar cabeçalhos personalizados às solicitações de origem](add-origin-custom-headers.md#add-origin-custom-headers-configure).

**Política de protocolo do visualizador**  
Configure a distribuição para exigir que os visualizadores usem HTTPS para acessar o CloudFront. Consulte [Política de protocolo do visualizador](DownloadDistValuesCacheBehavior.md#DownloadDistValuesViewerProtocolPolicy). 

**Política de protocolo da origem**  
Configure sua distribuição para exigir que o CloudFront use o mesmo protocolo que os visualizadores para encaminhar solicitações para a origem. Consulte [Protocolo (somente origens personalizadas)](DownloadDistValuesOrigin.md#DownloadDistValuesOriginProtocolPolicy). 

Depois de fazer essas alterações, atualize sua aplicação na origem personalizada para aceitar somente solicitações que incluam os cabeçalhos personalizados que você configurou o CloudFront para enviar.

A combinação de **Viewer Protocol Policy (Política de protocolo do visualizador)** e **Origin Protocol Policy (Política de protocolo da origem)** garante que os cabeçalhos personalizados sejam criptografados em trânsito. No entanto, recomendamos que você execute periodicamente o seguinte, para alternar os cabeçalhos personalizados encaminhados pelo CloudFront para sua origem:

1. Atualize sua distribuição do CloudFront para começar a encaminhar um novo cabeçalho para sua origem personalizada.

1. Atualize sua aplicação para aceitar o novo cabeçalho como confirmação de que a solicitação é proveniente do CloudFront.

1. Quando as solicitações não incluírem mais o cabeçalho que você estiver substituindo, atualize a aplicação para não aceitar mais o cabeçalho antigo como confirmação de que a solicitação é proveniente do CloudFront.

# Especificar os assinantes que podem criar URLs e cookies assinados
<a name="private-content-trusted-signers"></a>

**Topics**
+ [Escolher entre grupos de chaves confiáveis (recomendado) e Contas da AWS](#choosing-key-groups-or-AWS-accounts)
+ [Criar pares de chaves para os assinantes](#private-content-creating-cloudfront-key-pairs)
+ [Reformatar a chave privada (somente .NET e Java)](#private-content-reformatting-private-key)
+ [Adicionar um assinante a uma distribuição](#private-content-adding-trusted-signers)
+ [Alternar pares de chaves](#private-content-rotating-key-pairs)

Para criar signed URLs ou cookies, é necessário um *assinante*. Um assinante é um grupo de chaves confiável criado no CloudFront ou uma conta da AWS que contém um par de chaves do CloudFront. Recomendamos que você use grupos de chaves confiáveis com signed URLs e cookies. Para obter mais informações, consulte [Escolher entre grupos de chaves confiáveis (recomendado) e Contas da AWS](#choosing-key-groups-or-AWS-accounts).

O assinante tem duas finalidades:
+ Assim que você adicionar o assinante à sua distribuição, o CloudFront começará a exigir que os visualizadores usem signed URLs ou signed cookies para acessar seus arquivos.
+ Ao criar signed URLs ou cookies, você usa a chave privada do par de chaves do assinante para assinar uma parte do URL ou do cookie. Quando alguém solicita um arquivo restrito, o CloudFront compara a assinatura no URL ou cookie com o URL ou cookie não assinado, para verificar se ele não foi adulterado. O CloudFront também verifica se o URL ou cookie é válido, ou seja, se a data e hora de expiração não passou, por exemplo.

Ao especificar um assinante, você também especifica indiretamente os arquivos que exigem signed URLs ou cookies adicionando o assinante a um comportamento de cache. Caso sua distribuição tenha somente um comportamento de cache, os visualizadores deverão usar signed URLs ou cookies para acessar qualquer arquivo na distribuição. Se criar vários comportamentos de cache e adicionar assinantes a alguns deles, mas não a outros, você poderá solicitar que os visualizadores usem signed URLs ou cookies para acessar alguns arquivos e não outros.

Para especificar os assinantes (as chaves privadas) com permissão para criar signed URLs ou signed cookies e adicionar os assinantes à sua distribuição do CloudFront, execute as seguintes tarefas:

1. Decida se pretende utilizar um grupo de chaves confiável ou uma Conta da AWS como assinante. Recomendamos o uso de um grupo de chaves confiável. Para obter mais informações, consulte [Escolher entre grupos de chaves confiáveis (recomendado) e Contas da AWS](#choosing-key-groups-or-AWS-accounts).

1. Para o assinante que você escolheu na etapa 1, crie um par de chaves pública/privada. Para obter mais informações, consulte [Criar pares de chaves para os assinantes](#private-content-creating-cloudfront-key-pairs).

1. Se você estiver usando .NET ou Java para criar signed URLs ou cookies, reformate a chave privada. Para obter mais informações, consulte [Reformatar a chave privada (somente .NET e Java)](#private-content-reformatting-private-key).

1. Na distribuição para a qual você está criando signed URLs ou cookies, especifique o assinante. Para obter mais informações, consulte [Adicionar um assinante a uma distribuição](#private-content-adding-trusted-signers).

## Escolher entre grupos de chaves confiáveis (recomendado) e Contas da AWS
<a name="choosing-key-groups-or-AWS-accounts"></a>

Para usar signed URLs ou cookies, é necessário um *assinante*. Um assinante é um grupo de chaves confiável criado no CloudFront ou uma Conta da AWS que contenha um par de chaves do CloudFront. Recomendamos que você use grupos de chaves confiáveis, pelos seguintes motivos:
+ Com os grupos de chaves do CloudFront, não é necessário usar o usuário root da conta da AWS para gerenciar as chaves públicas para URLs assinados e cookies do CloudFront. As [práticas recomendadas da AWS](https://docs.aws.amazon.com/general/latest/gr/root-vs-iam.html#aws_tasks-that-require-root) aconselham não usar o usuário root, exceto quando estritamente necessário.
+ Com os grupos de chaves do CloudFront, é possível gerenciar chaves públicas, grupos de chaves e assinantes confiáveis usando a API do CloudFront. É possível usar a API para automatizar a criação de chaves e a alternância de chaves. Quando você usa o usuário-raiz da AWS, é necessário usar o Console de gerenciamento da AWS para gerenciar pares de chaves do CloudFront, por isso o processo não pode ser automatizado.
+ Como você pode gerenciar grupos de chaves com a API do CloudFront, também é possível usar as políticas de permissões do AWS Identity and Access Management (IAM) para limitar as ações permitidas aos diferentes usuários. Por exemplo, é possível permitir que os usuários façam upload de chaves públicas, mas não excluí-las. Ou, é possível permitir que os usuários excluam chaves públicas, mas somente quando determinadas condições forem atendidas, como usar autenticação multifator, enviar a solicitação de uma determinada rede ou enviar a solicitação dentro de um determinado intervalo de data e hora.
+ Com grupos de chaves do CloudFront, é possível associar um número maior de chaves públicas à sua distribuição do CloudFront, proporcionando mais flexibilidade na forma como você usa e gerencia as chaves públicas. Por padrão, é possível associar até quatro grupos de chaves a uma única distribuição e ter até cinco chaves públicas em um grupo de chaves.

  Ao usar a conta da AWS do usuário-raiz para gerenciar pares de chaves do CloudFront, você só poderá ter até dois pares de chaves ativos do CloudFront por conta da AWS.

## Criar pares de chaves para os assinantes
<a name="private-content-creating-cloudfront-key-pairs"></a>

Cada assinante usado para criar signed URLs ou signed cookies do CloudFront deve ter um par de chaves pública/privada. O assinante usa sua chave privada para assinar o URL ou os cookies e o CloudFront usa a chave pública para verificar a assinatura.

A maneira como você cria um par de chaves depende se você usa um grupo de chaves confiável como assinante (recomendado) ou um par de chaves do CloudFront. Para obter mais informações, consulte as seções a seguir. O par de chaves que criar deve atender aos seguintes requisitos:
+ Deve ser um par de chaves SSH-2 RSA 2048 ou ECDSA 256.
+ Ele deve estar no formato PEM codificado em base64.

Para ajudar a proteger sias aplicações, recomendamos que você alterne os pares de chaves periodicamente. Para obter mais informações, consulte [Alternar pares de chaves](#private-content-rotating-key-pairs).

### Criar um par de chaves para um grupo de chaves confiável (recomendado)
<a name="create-key-pair-and-key-group"></a>

Para criar um par de chaves para um grupo de chaves confiável, execute as seguintes etapas:

1. Crie o par de chaves pública/privada.

1. Faça upload da chave pública no CloudFront.

1. Adicione a chave pública a um grupo de chaves do CloudFront.

Para obter mais informações, consulte os procedimentos a seguir.<a name="private-content-uploading-cloudfront-public-key-procedure"></a>

**Para criar um par de chaves**
**nota**  
As etapas a seguir usam OpenSSL como um exemplo de método para criar um par de chaves. Há várias outras maneiras de criar um par de chaves RSA ou ECDSA.

1. Execute um dos seguintes comandos de exemplo:
   + O comando de exemplo a seguir usa OpenSSL para gerar um par de chaves RSA com um tamanho de 2.048 bits e salvar no arquivo chamado `private_key.pem`.

     ```
     openssl genrsa -out private_key.pem 2048
     ```
   + O comando de exemplo a seguir usa OpenSSL para gerar um par de chaves ECDSA com a curva `prime256v1` e salvar no arquivo chamado `private_key.pem`.

     ```
     openssl ecparam -name prime256v1 -genkey -noout -out privatekey.pem
     ```

1. O arquivo resultante contém a chave pública e a privada. O comando de exemplo a seguir extrai a chave pública do arquivo chamado `private_key.pem`.

   ```
   openssl rsa -pubout -in private_key.pem -out public_key.pem
   ```

   Faça upload da chave pública (no arquivo `public_key.pem`) posteriormente, no procedimento a seguir.

**Como carregar a chave pública no CloudFront**

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

1. No menu de navegação, escolha **Public keys (Chaves públicas)**.

1. Selecione **Create public key** (Criar chave pública).

1. Na janela **Create public key** (Criar chave pública), faça o seguinte:

   1. Em **Key name (Nome da chave)**, digite um nome para identificar a chave pública.

   1. Em **Key value (Valor da chave)**, cole a chave pública. Se você seguiu as etapas no procedimento anterior, a chave pública está no arquivo chamado `public_key.pem`. Para copiar e colar o conteúdo da chave pública, é possível:
      + Usar o comando **cat** na linha de comando do macOS ou do Linux, da seguinte forma:

        ```
        cat public_key.pem
        ```

        Copie a saída desse comando e cole-a no campo **Key value (Valor da chave)**.
      + Abra o arquivo `public_key.pem` com um editor de texto simples, como o Notepad (no Windows) ou o TextEdit (no macOS). Copie o conteúdo do arquivo e cole-o no campo **Key value (Valor da chave)**.

   1. (Opcional) Em **Comment (Comentário)**, adicione um comentário para descrever a chave pública.

   Quando terminar, escolha **Add (Adicionar)**.

1. Registre o ID da chave pública. Ele será usado posteriormente quando você criar signed URLs ou cookies como o valor do campo `Key-Pair-Id`.

**Como adicionar a chave pública a um grupo de chaves**

1. Abra o console do CloudFront em [https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home).

1. No menu de navegação, escolha **Key groups (Grupos de chaves)**.

1. Escolha **Add key group (Adicionar grupo de chaves)**.

1. Na página **Create key group (Criar grupo de chaves)** faça o seguinte:

   1. Em **Key group name (Nome do grupo de chaves)**, digite um nome para identificar o grupo de chaves.

   1. (Opcional) Em **Comment (Comentário)**, digite um comentário para descrever o grupo de chaves.

   1. Em **Public keys (Chaves públicas)**, selecione a chave pública a ser adicionada ao grupo de chaves e escolha **Add (Adicionar)**. Repita essa etapa para cada chave pública que você deseja adicionar ao grupo de chaves.

1. Escolha **Create key group (Criar grupo de chaves)**.

1. Registre o nome do grupo de chaves. Ele será usado posteriormente para associar o grupo de chaves a um comportamento de cache em uma distribuição do CloudFront. (Na API do CloudFront, use o ID do grupo de chaves para associar o grupo de chaves a um comportamento de cache.)

### Criar um par de chaves do CloudFront (não recomendado, requer o usuário-raiz da Conta da AWS)
<a name="create-key-pair-aws-account"></a>

**Importante**  
Recomendamos que você crie uma chave pública para um grupo de chaves confiável em vez de seguir estas etapas. Para a maneira recomendada de criar chaves públicas para signed URLs e signed cookies, consulte [Criar um par de chaves para um grupo de chaves confiável (recomendado)](#create-key-pair-and-key-group).

É possível criar um par de chaves do CloudFront das seguintes maneiras:
+ Crie um par de chaves no Console de gerenciamento da AWS e faça download da chave privada. Consulte o procedimento a seguir.
+ Crie um par de chaves RSA usando uma aplicação, como o OpenSSL, e faça upload da chave pública no Console de gerenciamento da AWS. Para mais informações sobre como criar um par de chaves RSA, consulte [Criar um par de chaves para um grupo de chaves confiável (recomendado)](#create-key-pair-and-key-group).<a name="private-content-creating-cloudfront-key-pairs-procedure"></a>

**Para criar pares de chaves do CloudFront no Console de gerenciamento da AWS**

1. Faça login no Console de gerenciamento da AWS usando as credenciais do usuário-raiz da conta da AWS.
**Importante**  
Usuários do IAM não podem criar pares de chaves do CloudFront. É necessário fazer login usando as credenciais de usuário-raiz para criar pares de chaves.

1. Escolha o nome da sua conta e selecione **My Security Credentials (Minhas credenciais de segurança)**.

1. Escolha **CloudFront key pairs (Pares de chaves do CloudFront)**.

1. Confirme se você não têm mais de um par de chaves ativo. Não será possível criar um par de chaves se você já tiver dois pares de chaves ativos.

1. Selecione **Create a new key pair (Criar um par de chaves)**.
**nota**  
Também é possível criar um par de chaves próprio e fazer upload da chave pública. Os pares de chaves do CloudFront são compatíveis com chaves de 1024, 2048 ou 4096 bits.

1. Na caixa de diálogo **Create Key Pair (Criar par de chaves)**, escolha **Download Private Key File (Fazer download do arquivo de chave privada)** e salve o arquivo no computador.
**Importante**  
Salve a chave privada do par de chaves do CloudFront em um local seguro e defina as permissões no arquivo para que somente os usuários administradores desejados possam lê-lo. Se alguém obtiver sua chave privada, poderá gerar signed URLs e cookies válidos e fazer download do seu conteúdo. Não é possível gerar a chave privada novamente. Portanto, se perder ou excluí-la, crie outro par de chaves do CloudFront.

1. Anote o ID do seu par de chaves. (No Console de gerenciamento da AWS, ele é chamado de **ID de chave de acesso**.) Ele será usado quando você criar signed URLs ou cookies.

## Reformatar a chave privada (somente .NET e Java)
<a name="private-content-reformatting-private-key"></a>

Se estiver usando .NET ou Java para criar signed URLs ou cookies, você não poderá usar a chave privada do par de chaves no formato padrão PEM para criar a assinatura. Em vez disso, faça o seguinte:
+ **Framework .NET**: converta a chave privada no formato XML usado pelo framework .NET. Várias ferramentas estão disponíveis.
+ **Java**: converta a chave privada no formato DER. Uma maneira de fazer isso é com o comando OpenSSL a seguir. No comando a seguir, `private_key.pem` é o nome do arquivo que contém a chave privada formatada em PEM e `private_key.der` é o nome do arquivo que contém a chave privada formatada em DER depois que o comando é executado.

  ```
  openssl pkcs8 -topk8 -nocrypt -in private_key.pem -inform PEM -out private_key.der -outform DER
  ```

  Para garantir que o codificador funcione corretamente, adicione o JAR para as APIs de criptografia Java Bouncy Castle do seu projeto e adicione o provedor do Bouncy Castle.

## Adicionar um assinante a uma distribuição
<a name="private-content-adding-trusted-signers"></a>

Um assinante é o grupo de chaves confiável (recomendado) ou o par de chaves do CloudFront que pode criar signed URLs e signed cookies para uma distribuição. Para usar signed URLs ou signed cookies com uma distribuição do CloudFront, é necessário especificar um assinante.

Os assinantes estão associados a comportamentos de cache. Isso permite exigir signed URLs ou cookies para alguns arquivos e não para outros na mesma distribuição. Uma distribuição requer signed URLs ou cookies somente para arquivos associados aos comportamentos de cache correspondentes.

Da mesma forma, um assinante só pode assinar URLs ou cookies para arquivos associados aos comportamentos de cache correspondentes. Por exemplo, se você tiver um assinante para um comportamento de cache e um assinante diferente para outro comportamento de cache, nenhum dos dois assinantes poderão criar signed URLs ou cookies para arquivos associados ao outro comportamento de cache.

**Importante**  
Antes de adicionar um assinante à sua distribuição, faça o seguinte:  
Defina os padrões de caminho nos comportamentos de cache e a sequência de comportamentos de cache cuidadosamente para que você não dê aos usuários acesso indesejado ao seu conteúdo ou impeça que eles acessem o conteúdo que você deseja que esteja disponível para todos.  
Por exemplo, imagine que uma solicitação corresponda ao padrão de caminho de dois comportamentos de cache. O primeiro comportamento de cache não requer signed URLs ou cookies, mas o segundo comportamento de cache, sim. Os usuários poderão acessar os arquivos sem usar signed URLs ou signed cookies porque o CloudFront processa o comportamento de cache associado à primeira correspondência.  
Para obter mais informações sobre padrões de caminho, consulte [Padrão de caminho](DownloadDistValuesCacheBehavior.md#DownloadDistValuesPathPattern).
Para uma distribuição que você já esteja usando para distribuir conteúdo, certifique-se de que esteja pronto para começar a gerar signed URLs e cookies antes de adicionar um assinante. Quando você adiciona um assinante, o CloudFront rejeita as solicitações que não incluam um signed URL ou signed cookie válido.

É possível adicionar assinantes à sua distribuição usando o console ou a API do CloudFront.

------
#### [ Console ]

As etapas a seguir mostram como adicionar um grupo de chaves confiável como assinante. Também é possível adicionar uma Conta da AWS como signatário confiável, mas isso não é recomendado.<a name="private-content-adding-trusted-signers-console-procedure"></a>

**Como adicionar um assinante a uma distribuição usando o console**

1. Registre o ID do grupo de chaves que você deseja usar como signatário confiável. Para obter mais informações, consulte [Criar um par de chaves para um grupo de chaves confiável (recomendado)](#create-key-pair-and-key-group).

1. Abra o console do CloudFront em [https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home).

1. Escolha a distribuição com os arquivos você deseja proteger com signed URLs ou cookies.
**nota**  
Para adicionar um assinante a uma nova distribuição, especifique as mesmas configurações descritas na etapa 6 ao criar a distribuição.

1. Escolha a guia **Behaviors**.

1. Selecione o comportamento de cache com o padrão de caminho corresponde aos arquivos que você deseja proteger com signed URLs ou cookies e escolha **Edit (Editar)**.

1. Na página **Edit Behavior (Editar Comportamento)** faça o seguinte:

   1. Em **Restrict Viewer Access (Use Signed URLs or Signed Cookies) (Restringir acesso do visualizador (Usar signed URLs ou signed Cookies))**, escolha **Yes (Sim)**.

   1. Em **Trusted Key Groups or Trusted Signer (Grupos de chaves confiáveis ou signatário confiável)**, escolha **Trusted Key Groups (Grupos de chaves confiáveis)**.

   1. Em **Trusted Key Groups (Grupos de chaves confiáveis)**, escolha o grupo de chaves a ser adicionado e escolha **Add (Adicionar)**. Repita se quiser adicionar mais de um grupo de chaves.

1. Escolha **Yes, Edit (Sim, editar)** para atualizar o comportamento do cache.

------
#### [ API ]

É possível usar a API do CloudFront para adicionar um grupo de chaves confiável como assinante. É possível adicionar um assinante a uma distribuição existente ou a uma nova distribuição. Em qualquer caso, especifique os valores no elemento `TrustedKeyGroups`.

Também é possível adicionar uma Conta da AWS como signatário confiável, mas isso não é recomendado.

Consulte os seguintes tópicos na *Referência da API do Amazon CloudFront*:
+ **Atualizar uma distribuição existente**: [UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html)
+ **Criar uma nova distribuição**: [CreateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateDistribution.html)

------

## Alternar pares de chaves
<a name="private-content-rotating-key-pairs"></a>

Recomendamos que você alterne (mude) periodicamente seus pares de chaves para signed URLs e cookies. Para alternar os pares de chaves que você estiver usando para criar signed URLs ou cookies sem invalidar os URLs ou os cookies que ainda não expiraram, execute as seguintes tarefas:

1. Crie um par de chaves e adicione a chave pública a um grupo de chaves. Para obter mais informações, consulte [Criar um par de chaves para um grupo de chaves confiável (recomendado)](#create-key-pair-and-key-group).

1. Se você criou um grupo de chaves na etapa anterior, [adicione-o à distribuição como assinante](#private-content-adding-trusted-signers).
**Importante**  
Não remova nenhuma chave pública existente do grupo de chaves ou nenhum grupo de chaves da distribuição ainda. Somente adicione os novos.

1. Atualize sua aplicação para criar assinaturas usando a chave privada do novo par de chaves. Confirme se os signed URLs ou cookies com as novas chaves privadas estão funcionando.

1. Espere passar a data de expiração dos URLs ou cookies que foram assinados usando a chave privada antiga. Depois, remova a chave pública antiga do grupo de chaves. Se você criou um grupo de chaves na etapa 2, remova o grupo de chaves antigo da sua distribuição.

# Decidir usar URLs ou cookies assinados
<a name="private-content-choosing-signed-urls-cookies"></a>

Os signed URLs e signed cookies do CloudFront fornecem a mesma funcionalidade básica: eles permitem controlar quem pode acessar seu conteúdo. Se você quiser fornecer conteúdo privado pelo CloudFront e estiver tentando decidir se usará signed URLs ou signed cookies, considere as informações a seguir.

Use signed URLs nos seguintes casos:
+ Você quer restringir o acesso a arquivos individuais, por exemplo, o download de uma instalação para seu aplicativo.
+ Seus usuários estão usando um cliente (por exemplo, um cliente HTTP personalizado) incompatível com cookies.

Use signed cookies nos seguintes casos:
+ Você quer fornecer acesso a vários arquivos restritos, por exemplo, todos os arquivos de um vídeo no formato HLS ou todos os arquivos da área de assinantes de um site.
+ Você não quer alterar seus URLs atuais.

Se você não estiver usando URLs assinados e seus URLs (não assinados) contiverem um dos seguintes parâmetros de string de consulta, você não poderá usar signed URLs ou signed cookies:
+ `Expires`
+ `Policy`
+ `Signature`
+ `Key-Pair-Id`

O CloudFront pressupõe que os URLs que contenham um desses parâmetros de query string sejam signed URLs, portanto, não analisará os signed cookies.

## Usar URLs e cookies assinados
<a name="private-content-using-signed-urls-and-cookies"></a>

Signed URLs têm precedência sobre signed cookies. Se você usar signed URLs e signed cookies para controlar o acesso aos mesmos arquivos e um visualizador usar um signed URL para solicitar um arquivo, o CloudFront determinará se retornará o arquivo para o visualizador com base somente no signed URL.

# Usar URLs assinados
<a name="private-content-signed-urls"></a>

Um signed URL inclui informações adicionais, por exemplo, uma data e hora de expiração, que proporcionam a você mais controle sobre o acesso a seu conteúdo. Essas informações adicionais são descritas em uma declaração de política, que é baseada em uma política padrão ou personalizada. As diferenças entre a política padrão e a personalizada estão explicadas nas duas próximas seções.

**nota**  
Você pode criar alguns signed URLs usando políticas padrão e outros usando políticas personalizadas para a mesma distribuição.

**Topics**
+ [Decidir usar políticas predefinidas ou personalizadas para URLs assinados](#private-content-choosing-canned-custom-policy)
+ [Como signed URLs funcionam](#private-content-how-signed-urls-work)
+ [Decidir o tempo de validade de URLs assinados](#private-content-overview-choosing-duration)
+ [Quando o CloudFront confere a data e hora de validade de um URL assinado?](#private-content-check-expiration)
+ [Código de exemplo e ferramentas de terceiros](#private-content-overview-sample-code)
+ [Criar um URL assinado usando uma política predefinida](private-content-creating-signed-url-canned-policy.md)
+ [Criar um URL assinado usando uma política personalizada](private-content-creating-signed-url-custom-policy.md)

## Decidir usar políticas predefinidas ou personalizadas para URLs assinados
<a name="private-content-choosing-canned-custom-policy"></a>

Ao criar um signed URL, você grava uma declaração de política no formato JSON que especifica as restrições no signed URL, por exemplo, por quanto tempo o URL é válido. Você pode usar uma política padrão ou personalizada. Veja uma comparação entre as duas:


****  

| Descrição | Política padrão | Política personalizada | 
| --- | --- | --- | 
| Você pode reutilizar a declaração de política para vários arquivos. Para reutilizar a declaração de política, é necessário usar caracteres curinga no objeto `Resource`. Para obter mais informações, consulte [Valores especificados na declaração de política para um signed URL que usa uma política personalizada](private-content-creating-signed-url-custom-policy.md#private-content-custom-policy-statement-values).)  | Não | Sim | 
| Você pode especificar a data e a hora em que os usuários podem começar a acessar seu conteúdo. | Não | Sim (opcional) | 
| Você pode especificar a data e a hora em que os usuários não podem mais acessar seu conteúdo. | Sim | Sim | 
| Você pode especificar o endereço IP ou vários endereços IP dos usuários que podem acessar seu conteúdo. | Não | Sim (opcional) | 
| O signed URL inclui uma versão da política codificada em base64, resultando em um URL mais longo. | Não | Sim | 

Para obter informações sobre como criar signed URLs usando uma política *padrão*, consulte [Criar um URL assinado usando uma política predefinida](private-content-creating-signed-url-canned-policy.md).

Para obter informações sobre como criar signed URLs usando uma política *personalizada*, consulte [Criar um URL assinado usando uma política personalizada](private-content-creating-signed-url-custom-policy.md).

## Como signed URLs funcionam
<a name="private-content-how-signed-urls-work"></a>

A seguir, uma visão geral de como configurar o CloudFront e o Amazon S3 para signed URLs e como o CloudFront responde quando um usuário usa um signed URL para solicitar um arquivo. 

1. Na sua distribuição do CloudFront, especifique um ou mais grupos de chaves confiáveis, que contenham as chaves públicas que o CloudFront pode usar para verificar a assinatura do URL. Use as chaves privadas correspondentes para assinar os URLs.

   O CloudFront permite URLs assinados com assinaturas de chave RSA 2048 e ECDSA 256.

   Para obter mais informações, consulte [Especificar os assinantes que podem criar URLs e cookies assinados](private-content-trusted-signers.md).

1. Desenvolva sua aplicação para determinar se um usuário deve ter acesso a seu conteúdo e criar signed URLs para os arquivos ou partes da aplicação às quais você deseja restringir o acesso. Para obter mais informações, consulte os tópicos a seguir:
   + [Criar um URL assinado usando uma política predefinida](private-content-creating-signed-url-canned-policy.md)
   + [Criar um URL assinado usando uma política personalizada](private-content-creating-signed-url-custom-policy.md)

1. Um usuário solicita um arquivo para o qual você deseja exigir signed URLs.

1. Seu aplicativo verifica se o usuário está autorizado a acessar o arquivo: ele fez login, pagou para acessar o conteúdo ou atendeu a outro requisito de acesso.

1. O aplicativo cria e retorna um signed URL para o usuário.

1. O signed URL permite que o usuário faça download ou transmita o conteúdo.

   Essa etapa é automática; o usuário geralmente não precisa fazer nada a mais para acessar o conteúdo. Por exemplo, se um usuário estiver acessando seu conteúdo em um navegador da Web, a aplicação retornará o signed URL para o navegador. O navegador imediatamente usa o signed URL para acessar o arquivo no ponto de presença de caches do CloudFront sem intervenção do usuário.

1. O CloudFront usa a chave pública para validar a assinatura e confirmar se o URL não foi adulterado. Se a assinatura for inválida, a solicitação será rejeitada. 

   Se a assinatura for válida, o CloudFront analisará a declaração de política no URL (ou criará uma se você estiver usando uma política padrão) para confirmar se a solicitação continua válida. Por exemplo, se você especificou uma data e hora de início e término para o URL, o CloudFront confirmará se o usuário está tentando acessar o conteúdo durante o período de acesso permitido. 

   Se a solicitação cumprir os requisitos da declaração de política, o CloudFront executará as operações padrão: determinar se o arquivo já está no ponto de presença de caches, encaminhar a solicitação para a origem, se necessário, e retornar o arquivo para o usuário.

**nota**  
Se um URL não assinado contiver parâmetros de string de consulta, certifique-se de incluí-los na parte do URL que você assinar. Se você adicionar uma string de consulta a um signed URL depois de assiná-lo, o URL retornará um status HTTP 403.

## Decidir o tempo de validade de URLs assinados
<a name="private-content-overview-choosing-duration"></a>

Você pode distribuir conteúdo privado usando um signed URL válido apenas por um período curto (possivelmente por apenas alguns minutos). URLs assinados válidos por um curto período são bons para distribuir conteúdo imediato a um usuário para uma finalidade específica, como a distribuição de aluguéis de filmes ou downloads de música para os clientes sob demanda. Caso seu signed URLs sejam válidos apenas por um curto período, gere-os automaticamente usando um aplicativo desenvolvido por você. Quando o usuário começar a fazer download de um arquivo ou a reproduzir um arquivo de mídia, o CloudFront comparará a hora de expiração do URL com a hora atual para determinar se o URL continua válido.

Você também pode distribuir conteúdo privado usando um signed URL válido por um período mais longo (possivelmente por anos). Signed URLs válidos por um período mais longo são úteis para distribuir conteúdo privado para usuários conhecidos, como a distribuição de um plano de negócios para investidores ou de materiais de treinamento para funcionários. É possível desenvolver uma aplicação para gerar esses URLs assinados de longo prazo para você.

## Quando o CloudFront confere a data e hora de validade de um URL assinado?
<a name="private-content-check-expiration"></a>

O CloudFront verifica a data e hora de expiração de um signed URL no momento da solicitação HTTP. Se um cliente começar a fazer download de um grande arquivo logo antes da hora de expiração, o download será concluído mesmo se passar a hora de expiração durante o download. Se a conexão TCP cair e o cliente tentar reiniciar o download após a hora de expiração, ocorrerá falha no download.

Se o cliente usar Range GETs para obter um arquivo em partes menores, ocorrerá falha em qualquer solicitação GET que ocorrer após a hora de expiração. Para obter mais informações sobre Range GETs, consulte [Como o CloudFront processa solicitações parciais de um objeto (Range GETs)](RangeGETs.md).

## Código de exemplo e ferramentas de terceiros
<a name="private-content-overview-sample-code"></a>

Para obter um código de exemplo que cria a parte assinada e com hash dos signed URLs, consulte os seguintes tópicos:
+ [Criar uma assinatura de URL usando Perl](CreateURLPerl.md)
+ [Criar uma assinatura de URL usando PHP](CreateURL_PHP.md)
+ [Criar uma assinatura de URL usando C\$1 e o .NET Framework](CreateSignatureInCSharp.md)
+ [Criar uma assinatura de URL usando Java](CFPrivateDistJavaDevelopment.md)

# Criar um URL assinado usando uma política predefinida
<a name="private-content-creating-signed-url-canned-policy"></a>

Para criar um signed URL usando uma política enlatada, conclua as etapas a seguir.<a name="private-content-creating-signed-url-canned-policy-procedure"></a>

**Para criar um signed URL usando uma política padrão**

1. Se você estiver usando o .NET ou Java para criar signed URLs e não tiver reformatado a chave privada do seu par de chaves para do formato padrão .pem para um formato compatível com o .NET ou Java, faça isso agora. Para obter mais informações, consulte [Reformatar a chave privada (somente .NET e Java)](private-content-trusted-signers.md#private-content-reformatting-private-key).

1. Concatene os valores a seguir. Você pode usar o formato neste exemplo de URL assinado. 

   ```
   https://d111111abcdef8.cloudfront.net/image.jpg?color=red&size=medium&Expires=1767290400&Signature=nitfHRCrtziwO2HwPfWw~yYDhUF5EwRunQA-j19DzZrvDh6hQ73lDx~-ar3UocvvRQVw6EkC~GdpGQyyOSKQim-TxAnW7d8F5Kkai9HVx0FIu-5jcQb0UEmatEXAMPLE3ReXySpLSMj0yCd3ZAB4UcBCAqEijkytL6f3fVYNGQI6&Key-Pair-Id=K2JCJMDEHXQW5F
   ```

   Remova todos os espaços vazios (inclusive caracteres de nova linha e de tabulação). Pode ser necessário incluir caracteres de escape na string do código do aplicativo. Todos os valores têm um tipo de `String`.  
**1. *URL base do arquivo***  
O URL base é o URL do CloudFront usado para acessar o arquivo se você não estivesse usando signed URLs, inclusive seus próprios parâmetros de query string, se houver. No exemplo anterior, o URL de base é `https://d111111abcdef8.cloudfront.net/image.jpg`. Para mais informações sobre o formato dos URLs para distribuições, consulte [Personalizar o formato do URL para arquivos no CloudFront](LinkFormat.md).  
   + O URL do CloudFront a seguir é para um arquivo de imagem em uma distribuição (usando o nome de domínio do CloudFront). Observe que `image.jpg` está em um diretório `images`. O caminho para o arquivo no URL deve corresponder ao caminho para o arquivo no servidor HTTP ou no bucket do Amazon S3.

     `https://d111111abcdef8.cloudfront.net/images/image.jpg`
   + O seguinte URL do CloudFront inclui uma query string:

     `https://d111111abcdef8.cloudfront.net/images/image.jpg?size=large`
   + Os URLs do CloudFront a seguir são para arquivos de imagem em uma distribuição. Ambos usam um nome de domínio alternativo. O segundo inclui uma string de consulta:

     `https://www.example.com/images/image.jpg`

     `https://www.example.com/images/image.jpg?color=red`
   + O URL do CloudFront a seguir é para um arquivo de imagem em uma distribuição que usa um nome de domínio alternativo e o protocolo HTTPS:

     `https://www.example.com/images/image.jpg`  
** 2. `?`**  
O `?` indica que os parâmetros de string de consulta seguem o URL base. Inclua o `?` mesmo que você não especifique nenhum parâmetro de consulta.  
Você pode especificar os parâmetros de consulta a seguir em qualquer ordem.  
**3. *Seus parâmetros de string de consulta, se houver*`&`**  
(Opcional) Você pode inserir seus próprios parâmetros de string de consulta. Para fazer isso, adicione um e comercial (`&`) entre cada um, como `color=red&size=medium`. Você pode especificar parâmetros de string de consulta em qualquer ordem dentro do URL.  
Seus parâmetros de string de consulta não podem ser especificados como `Expires`, `Signature` ou `Key-Pair-Id`.  
** 4. `Expires=`*data e hora no formato de hora do Unix (em segundos) e no Tempo Universal Coordenado (UTC)***  
A data e a hora em que você deseja que o URL pare de permitir acesso ao arquivo.  
Especifique a data e hora de expiração no formato de hora do Unix (em segundos) e no Tempo Universal Coordenado (UTC). Por exemplo, 1.º de janeiro de 2026 10h UTC é convertido em `1767290400` no formato de hora do Unix, conforme mostrado no exemplo no início deste tópico.   
Para usar o tempo de época, especifique um número inteiro de 64 bits para uma data que não seja posterior a `9223372036854775807` (sexta-feira, 11 de abril de 2262 às 23:47:16.854 UTC).  
  
Para ter informações sobre UTC, consulte [RFC 3339, Date and Time on the Internet: Timestamps](https://tools.ietf.org/html/rfc3339).  
** 5. `&Signature=`*versão assinada e com hash da declaração de política***  
Uma versão assinada, com hash e codificação base64 da declaração de política do JSON. Para obter mais informações, consulte [Criar uma assinatura para um URL assinado que use uma política predefinida](#private-content-canned-policy-creating-signature).  
** 6. `&Key-Pair-Id=`*ID da chave pública do CloudFront cuja chave privada correspondente está sendo usada para gerar a assinatura***  
O ID de uma chave pública do CloudFront, por exemplo, `K2JCJMDEHXQW5F`. O ID da chave pública informa ao CloudFront qual chave pública deve ser usada para validar o signed URL. O CloudFront compara as informações da assinatura com as informações da declaração de política para verificar se o URL não foi adulterado.  
Essa chave pública deve pertencer a um grupo de chaves que seja um signatário confiável na distribuição. Para obter mais informações, consulte [Especificar os assinantes que podem criar URLs e cookies assinados](private-content-trusted-signers.md).

## Criar uma assinatura para um URL assinado que use uma política predefinida
<a name="private-content-canned-policy-creating-signature"></a>

Para criar a assinatura de um URL que use uma política predefinida, siga estes procedimentos.

**Topics**
+ [Criar uma declaração de política para um URL assinado que use uma política predefinida](#private-content-canned-policy-creating-policy-statement)
+ [Criar uma assinatura para um URL assinado que use uma política predefinida](#private-content-canned-policy-signing-policy-statement)

### Criar uma declaração de política para um URL assinado que use uma política predefinida
<a name="private-content-canned-policy-creating-policy-statement"></a>

Ao criar um signed URL usando uma política padrão, o parâmetro `Signature` será uma versão assinada e com hash de uma declaração de política. Para signed URLs que usam uma política padrão, a declaração de política não é incluída no URL, como é feito nos signed URLs que usam uma política personalizada. Para criar a declaração de política, siga o procedimento abaixo.<a name="private-content-canned-policy-creating-policy-statement-procedure"></a>

**Para criar a declaração de política para um signed URL que usa uma política padrão**

1. Crie a declaração de política usando o formato JSON a seguir e a codificação de caracteres UTF-8. Inclua todas as pontuações e outros valores literais exatamente como especificado. Para obter informações sobre os parâmetros `Resource` e `DateLessThan`, consulte [Valores especificados na declaração de política para um signed URL que usa uma política padrão](#private-content-canned-policy-statement-values).

   ```
   {
       "Statement": [
           {
               "Resource": "base URL or stream name",
               "Condition": {
                   "DateLessThan": {
                       "AWS:EpochTime": ending date and time in Unix time format and UTC
                   }
               }
           }
       ]
   }
   ```

1. Remova todas os espaços em branco (inclusive caracteres de nova linha e de tabulação) da declaração de política. Pode ser necessário incluir caracteres de escape na string do código do aplicativo.

#### Valores especificados na declaração de política para um signed URL que usa uma política padrão
<a name="private-content-canned-policy-statement-values"></a>

Ao criar uma declaração de política para uma política padrão, especifique os valores a seguir.

**Recurso**  
Você pode especificar apenas um valor para `Resource`.
O URL base, com suas query strings, se houver, sem os parâmetros `Expires`, `Signature` e `Key-Pair-Id` do CloudFront, por exemplo:  
`https://d111111abcdef8.cloudfront.net/images/horizon.jpg?size=large&license=yes`  
Observe o seguinte:  
+ **Protocolo**: o valor deve começar com `http://` ou `https://`.
+ **Parâmetros de query string** :se você não tiver query strings, omita o ponto de interrogação.
+ **Nomes de domínio alternativos**: se especificar um nome de domínio alternativo (CNAME) no URL, você deverá especificá-lo ao fazer referência ao arquivo na sua página da web ou aplicação. Não especifique o URL do Amazon S3 do objeto.

**DateLessThan**  
A data e hora de expiração do URL no formato de hora do Unix (em segundos) e no Tempo Universal Coordenado (UTC). Por exemplo, 1.º de janeiro de 2026 10h UTC é convertido em 1357034400 no formato de hora do Unix.  
Esse valor deve corresponder ao valor do parâmetro de query string `Expires` do signed URL. Não coloque os valores entre aspas.  
Para obter mais informações, consulte [Quando o CloudFront confere a data e hora de validade de um URL assinado?](private-content-signed-urls.md#private-content-check-expiration).

#### Exemplo de declaração de política para um signed URL que usa uma política padrão
<a name="private-content-canned-policy-creating-policy-statement-example"></a>

Ao usar o seguinte exemplo de declaração de política em um URL, assinado, um usuário pode acessar o arquivo `https://d111111abcdef8.cloudfront.net/horizon.jpg` até 1.º de janeiro de 2026, 10h UTC:

```
{
    "Statement": [
        {
            "Resource": "https://d111111abcdef8.cloudfront.net/horizon.jpg?size=large&license=yes",
            "Condition": {
                "DateLessThan": {
                    "AWS:EpochTime": 1767290400
                }
            }
        }
    ]
}
```

### Criar uma assinatura para um URL assinado que use uma política predefinida
<a name="private-content-canned-policy-signing-policy-statement"></a>

Para criar o valor para o parâmetro `Signature` em um signed URL, assine e adicione um hash à declaração de política criada em [Criar uma declaração de política para um URL assinado que use uma política predefinida](#private-content-canned-policy-creating-policy-statement).

Para obter mais informações e exemplos de como adicionar hash, assinar e codificar a declaração de política, consulte:
+ [Comandos do Linux e OpenSSL para criptografia e codificação base64](private-content-linux-openssl.md)
+ [Exemplos de código para criar uma assinatura para um signed URL](PrivateCFSignatureCodeAndExamples.md)<a name="private-content-canned-policy-creating-signature-download-procedure"></a>

**Opção 1: Como criar uma assinatura usando uma política enlatada**

1. Use a função de hash SHA-1 e a chave privada RSA ou ECDSA gerada para assinar e adicionar um hash à declaração de política criada no procedimento [Para criar a declaração de política para um signed URL que usa uma política padrão](#private-content-canned-policy-creating-policy-statement-procedure). Use a versão da declaração de política que não inclui mais espaços em branco.

   Para a chave privada exigida pela função hash, use uma chave privada que tenha a chave pública em um grupo de chaves confiável ativo para a distribuição.
**nota**  
O método usado para assinar e adicionar um hash à declaração de política depende da sua linguagem de programação e plataforma. Para obter o código de exemplo, consulte [Exemplos de código para criar uma assinatura para um signed URL](PrivateCFSignatureCodeAndExamples.md).

1. Remova os espaços em branco (inclusive caracteres de nova linha e de tabulação) da string assinada e com hash.

1. Codifique a string usando codificação base64 MIME. Para obter mais informações, consulte [Section 6.8, Base64 Content-Transfer-Encoding](https://tools.ietf.org/html/rfc2045#section-6.8) em *RFC 2045, MIME (Multipurpose Internet Mail Extensions) Part One: Format of Internet Message Bodies*.

1. Substitua os caracteres inválidos da query string de um URL por caracteres válidos. A tabela a seguir indica os caracteres válidos e inválidos.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-canned-policy.html)

1. Inclua o valor resultante no seu signed URL depois de `&Signature=` e volte para [Para criar um signed URL usando uma política padrão](#private-content-creating-signed-url-canned-policy-procedure) para concluir a concatenação das partes dele.

# Criar um URL assinado usando uma política personalizada
<a name="private-content-creating-signed-url-custom-policy"></a>

Para criar um URL assinado usando uma política personalizada, execute o procedimento a seguir.<a name="private-content-creating-signed-url-custom-policy-procedure"></a>

**Para criar um signed URL usando uma política personalizada**

1. Se você estiver usando o .NET ou Java para criar signed URLs e não tiver reformatado a chave privada do seu par de chaves para do formato padrão .pem para um formato compatível com o .NET ou Java, faça isso agora. Para obter mais informações, consulte [Reformatar a chave privada (somente .NET e Java)](private-content-trusted-signers.md#private-content-reformatting-private-key).

1. Concatene os valores a seguir. Você pode usar o formato neste exemplo de URL assinado.

   

   ```
   https://d111111abcdef8.cloudfront.net/image.jpg?color=red&size=medium&Policy=eyANCiAgICEXAMPLEW1lbnQiOiBbeyANCiAgICAgICJSZXNvdXJjZSI6Imh0dHA6Ly9kemJlc3FtN3VuMW0wLmNsb3VkZnJvbnQubmV0L2RlbW8ucGhwIiwgDQogICAgICAiQ29uZGl0aW9uIjp7IA0KICAgICAgICAgIklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIyMDcuMTcxLjE4MC4xMDEvMzIifSwNCiAgICAgICAgICJEYXRlR3JlYXRlclRoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTI5Njg2MDE3Nn0sDQogICAgICAgICAiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjEyOTY4NjAyMjZ9DQogICAgICB9IA0KICAgfV0gDQp9DQo&Signature=nitfHRCrtziwO2HwPfWw~yYDhUF5EwRunQA-j19DzZrvDh6hQ73lDx~-ar3UocvvRQVw6EkC~GdpGQyyOSKQim-TxAnW7d8F5Kkai9HVx0FIu-5jcQb0UEmatEXAMPLE3ReXySpLSMj0yCd3ZAB4UcBCAqEijkytL6f3fVYNGQI6&Key-Pair-Id=K2JCJMDEHXQW5F
   ```

   Remova todos os espaços vazios (inclusive caracteres de nova linha e de tabulação). Pode ser necessário incluir caracteres de escape na string do código do aplicativo. Todos os valores têm um tipo de `String`.  
**1. *URL base do arquivo***  
O URL base é o URL do CloudFront usado para acessar o arquivo se você não estivesse usando signed URLs, inclusive seus próprios parâmetros de query string, se houver. No exemplo anterior, o URL de base é `https://d111111abcdef8.cloudfront.net/image.jpg`. Para mais informações sobre o formato dos URLs para distribuições, consulte [Personalizar o formato do URL para arquivos no CloudFront](LinkFormat.md).  
Os exemplos a seguir mostram os valores que você especifica para suas distribuições.  
   + O URL do CloudFront a seguir é para um arquivo de imagem em uma distribuição (usando o nome de domínio do CloudFront). Observe que `image.jpg` está em um diretório `images`. O caminho para o arquivo no URL deve corresponder ao caminho para o arquivo no servidor HTTP ou no bucket do Amazon S3.

     `https://d111111abcdef8.cloudfront.net/images/image.jpg`
   + O seguinte URL do CloudFront inclui uma query string:

     `https://d111111abcdef8.cloudfront.net/images/image.jpg?size=large`
   + Os URLs do CloudFront a seguir são para arquivos de imagem em uma distribuição. Os dois usam um nome de domínio alternativo; o segundo inclui uma query string:

     `https://www.example.com/images/image.jpg`

     `https://www.example.com/images/image.jpg?color=red`
   + O URL do CloudFront a seguir é para um arquivo de imagem em uma distribuição que usa um nome de domínio alternativo e o protocolo HTTPS:

     `https://www.example.com/images/image.jpg`  
**2. `?`**  
O `?` indica que os parâmetros de string de consulta seguem o URL base. Inclua o `?` mesmo que você não especifique nenhum parâmetro de consulta.  
Você pode especificar os parâmetros de consulta a seguir em qualquer ordem.  
**3. *Seus parâmetros de string de consulta, se houver*`&`**  
(Opcional) Você pode inserir seus próprios parâmetros de string de consulta. Para fazer isso, adicione um e comercial (&) entre cada um, como `color=red&size=medium`. Você pode especificar parâmetros de string de consulta em qualquer ordem dentro do URL.  
Seus parâmetros de string de consulta não podem ser especificados como `Policy`, `Signature` ou `Key-Pair-Id`.
Se você adicionar seus próprios parâmetros, inclua `&` depois de cada um deles, inclusive o último.   
**4. `Policy=`*versão da declaração de política codificada em base***  
Sua declaração de política no formato JSON, sem espaços em branco e com codificação base64. Para obter mais informações, consulte [Criar uma declaração de política para um URL assinado que use uma política personalizada](#private-content-custom-policy-statement).  
A declaração de política controla o acesso que um signed URL concede a um usuário. Ela inclui o URL do arquivo, uma data e hora de expiração, uma data e hora opcionais em que o URL se torna válido e um endereço IP opcional ou intervalo de endereços IP que tenha permissão para acessar o arquivo.  
**5. `&Signature=`*versão assinada e com hash da declaração de política***  
Uma versão assinada, com hash e codificação base64 da declaração de política do JSON. Para obter mais informações, consulte [Criar uma assinatura para um URL que use uma política personalizada](#private-content-custom-policy-creating-signature).  
**6. `&Key-Pair-Id=`*ID da chave pública do CloudFront cuja chave privada correspondente está sendo usada para gerar a assinatura***  
O ID de uma chave pública do CloudFront, por exemplo, `K2JCJMDEHXQW5F`. O ID da chave pública informa ao CloudFront qual chave pública deve ser usada para validar o signed URL. O CloudFront compara as informações da assinatura com as informações da declaração de política para verificar se o URL não foi adulterado.  
Essa chave pública deve pertencer a um grupo de chaves que seja um signatário confiável na distribuição. Para obter mais informações, consulte [Especificar os assinantes que podem criar URLs e cookies assinados](private-content-trusted-signers.md).

## Criar uma declaração de política para um URL assinado que use uma política personalizada
<a name="private-content-custom-policy-statement"></a>

Conclua as etapas a seguir para criar uma declaração de política para um signed URL que usa uma política personalizada.

Para obter exemplos de declarações de política que controlam o acesso a arquivos de diversas formas, consulte [Exemplos de declaração de política para um signed URL que usa uma política personalizada](#private-content-custom-policy-statement-examples).<a name="private-content-custom-policy-creating-policy-procedure"></a>

**Para criar a declaração de política para um signed URL que usa uma política personalizada**

1. Crie a declaração de política usando o formato JSON a seguir. Substitua os símbolos menor que (`<`) e maior que (`>`) e as descrições contidas neles por seus próprios valores. Para obter mais informações, consulte [Valores especificados na declaração de política para um signed URL que usa uma política personalizada](#private-content-custom-policy-statement-values).

   ```
   {
       "Statement": [
           {
               "Resource": "<Optional but recommended: URL of the file>",
               "Condition": {
                   "DateLessThan": {
   	                "AWS:EpochTime": <Required: ending date and time in Unix time format and UTC>
                   },
                   "DateGreaterThan": {
   	                "AWS:EpochTime": <Optional: beginning date and time in Unix time format and UTC>
                   },
                   "IpAddress": {
   	                "AWS:SourceIp": "<Optional: IP address>"
                   }
               }
           }
       ]
   }
   ```

   Observe o seguinte:
   + É possível incluir somente uma declaração na política.
   + Use a codificação de caracteres UTF-8.
   + Inclua todas as pontuações e nomes de parâmetro exatamente como especificado. Abreviações de nomes de parâmetro não são aceitas.
   + A ordem dos parâmetros na seção `Condition` não é importante.
   + Para obter informações sobre os valores de `Resource`, `DateLessThan`, `DateGreaterThan` e `IpAddress`, consulte [Valores especificados na declaração de política para um signed URL que usa uma política personalizada](#private-content-custom-policy-statement-values).

1. Remova todas os espaços em branco (inclusive caracteres de nova linha e de tabulação) da declaração de política. Pode ser necessário incluir caracteres de escape na string do código do aplicativo.

1. Codifique a declaração de política usando codificação base64 MIME. Para obter mais informações, consulte [Section 6.8, Base64 Content-Transfer-Encoding](https://tools.ietf.org/html/rfc2045#section-6.8) em *RFC 2045, MIME (Multipurpose Internet Mail Extensions) Part One: Format of Internet Message Bodies*.

1. Substitua os caracteres inválidos da query string de um URL por caracteres válidos. A tabela a seguir indica os caracteres válidos e inválidos.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-custom-policy.html)

1. Inclua o valor resultante ao seu signed URL depois de `Policy=`.

1. Crie uma assinatura para o signed URL adicionando hash, assinando e codificando em Base64 a declaração de política. Para obter mais informações, consulte [Criar uma assinatura para um URL que use uma política personalizada](#private-content-custom-policy-creating-signature).

### Valores especificados na declaração de política para um signed URL que usa uma política personalizada
<a name="private-content-custom-policy-statement-values"></a>

Ao criar uma declaração de política para uma política personalizada, especifique os valores a seguir.

**Recurso**  
O URL, incluindo quaisquer strings de consulta, mas excluindo os parâmetros `Policy`, `Signature` e `Key-Pair-Id` do CloudFront. Por exemplo:  
`https://d111111abcdef8.cloudfront.net/images/horizon.jpg\?size=large&license=yes`  
Você pode especificar somente um valor para `Resource`.  
Você pode omitir o parâmetro `Resource` de uma política, mas isso significa que qualquer pessoa com o signed URL poderá acessar *todos* os arquivos de *qualquer* distribuição associada ao par de chaves usado para criar o signed URL.
Observe o seguinte:  
+ **Protocolo**: o valor deve começar com `http://`, `https://` ou `*://`.
+ **Parâmetros da string de consulta**: se o URL tiver parâmetros da string de consulta, não use um caractere de barra invertida (`\`) para escapar do caractere de ponto de interrogação (`?`) que inicia a string de consulta. Por exemplo:

  `https://d111111abcdef8.cloudfront.net/images/horizon.jpg?size=large&license=yes`
+ **Caracteres curinga**: é possível usar caracteres curinga no URL da política. Os seguintes caracteres curinga são compatíveis:
  + asterisco (`*`), que corresponde a zero ou mais caracteres
  + ponto de interrogação (`?`) corresponde exatamente a um caractere

  Quando o CloudFront combina o URL na política com o URL na solicitação HTTP, o URL na política é dividido em quatro seções (protocolo, domínio, caminho e string de consulta) da seguinte forma:

  `[protocol]://[domain]/[path]\?[query string]`

  Quando você usa um caractere curinga no URL da política, a correspondência de curingas se aplica somente dentro dos limites da seção que contém o curinga. Por exemplo, considere este signed URL em uma política:

  `https://www.example.com/hello*world`

  Neste exemplo, o caractere curinga asterisco (`*`) só se aplica à seção do caminho, portanto, ele corresponde aos URLs `https://www.example.com/helloworld` e `https://www.example.com/hello-world`, mas não corresponde ao URL `https://www.example.net/hello?world`.

  As seguintes exceções se aplicam aos limites da seção para a correspondência de curingas:
  + Um asterisco final na seção do caminho implica um asterisco na seção da string de consulta. Por exemplo, `http://example.com/hello*` equivale a `http://example.com/hello*\?*`.
  + Um asterisco final na seção do domínio implica um asterisco nas seções do caminho e da string de consulta. Por exemplo, `http://example.com*` equivale a `http://example.com*/*\?*`.
  + Um URL na política pode omitir a seção do protocolo e começar com um asterisco na seção do domínio. Nesse caso, a seção do protocolo é definida implicitamente como um asterisco. Por exemplo, o URL `*example.com` em uma política é equivalente a `*://*example.com/`.
  + Um asterisco por si só (`"Resource": "*"`) corresponde a qualquer URL.

  Por exemplo, o valor `https://d111111abcdef8.cloudfront.net/*game_download.zip*` em uma política corresponde a todos os seguintes URLs:
  + `https://d111111abcdef8.cloudfront.net/game_download.zip`
  + `https://d111111abcdef8.cloudfront.net/example_game_download.zip?license=yes`
  + `https://d111111abcdef8.cloudfront.net/test_game_download.zip?license=temp`
+ **Nomes de domínio alternativos**: se você especificar um nome de domínio alternativo (CNAME) no URL na política, A solicitação HTTP deverá usar o nome do domínio alternativo na sua página da web ou aplicação. Não especifique o URL do Amazon S3 para o arquivo em uma política.

**DateLessThan**  
A data e hora de expiração do URL no formato de hora do Unix (em segundos) e no Tempo Universal Coordenado (UTC). Na política, não coloque os valores entre aspas. Para obter informações sobre UTC, consulte [Date and Time on the Internet: Timestamps](https://tools.ietf.org/html/rfc3339).  
Por exemplo, 31 de janeiro de 2023, 10h UTC é convertido em 1675159200 no formato de hora do Unix.  
Esse é o único parâmetro obrigatório na seção `Condition`. O CloudFront requer esse valor para impedir que os usuários tenham acesso permanente ao seu conteúdo privado.  
Para obter mais informações, consulte . [Quando o CloudFront confere a data e hora de validade de um URL assinado?](private-content-signed-urls.md#private-content-check-expiration)

**DateGreaterThan (opcional)**  
Uma data e hora de início opcional do URL no formato de hora do Unix (em segundos) e no Tempo Universal Coordenado (UTC). Os usuários não podem acessar o arquivo antes ou na data e hora especificadas. Não coloque os valores entre aspas. 

**IpAddress (opcional)**  
O endereço IP do cliente que está fazendo a solicitação HTTP. Observe o seguinte:  
+ Para permitir o acesso de qualquer endereço IP ao arquivo, omita o parâmetro `IpAddress`.
+ É possível especificar um ou vários endereços IP. Por exemplo, você não pode usar a política que permitir o acesso se o endereço IP do cliente estiver em um de dois intervalos separados.
+ Para permitir o acesso de um único endereço IP, especifique:

  `"`*IPv4 IP address*`/32"`
+ Você deve especificar os intervalos de endereço IP no formato CIDR IPv4 padrão (por exemplo, `192.0.2.0/24`). Para obter mais informações, consulte [Encaminhamento Entre Domínios Sem Classificação (CIDR): A atribuição do endereço da Internet e o plano de agregação](https://tools.ietf.org/html/rfc4632).
**Importante**  
Endereços IP no formato IPv6, como 2001:0db8:85a3::8a2e:0370:7334, não são compatíveis. 

  Se você estiver usando uma política personalizada que inclui `IpAddress`, não permita o IPv6 para a distribuição. Se você quiser restringir o acesso a um conteúdo por endereço IP e oferecer suporte a solicitações IPv6 para outro tipo de conteúdo, crie duas distribuições. Para obter mais informações, consulte [Habilitar IPv6 (solicitações do visualizador)](DownloadDistValuesGeneral.md#DownloadDistValuesEnableIPv6) no tópico [Referência de configurações de todas as distribuições](distribution-web-values-specify.md).

## Exemplos de declaração de política para um signed URL que usa uma política personalizada
<a name="private-content-custom-policy-statement-examples"></a>

Os exemplos de declaração de política a seguir mostram como controlar o acesso a um arquivo específico, todos os arquivos de um diretório ou todos os arquivos associados a um ID de par de chaves. Os exemplos também mostram como controlar o acesso de um único endereço IP ou um intervalo de endereços IP e como evitar que os usuários usem o signed URL após a data e hora especificadas.

Se você copiar e colar qualquer um desses exemplos, remova os espaços em branco (inclusive caracteres de nova linha e de tabulação), substitua os valores pelos seus próprios valores e inclua um caractere de nova linha após a chave de fechamento (`}`).

Para obter mais informações, consulte [Valores especificados na declaração de política para um signed URL que usa uma política personalizada](#private-content-custom-policy-statement-values).

**Topics**
+ [Exemplo de declaração de política: acessar um arquivo de um intervalo de endereços IP](#private-content-custom-policy-statement-example-one-object)
+ [Exemplo de declaração de política: acessar todos os arquivos de um diretório em um intervalo de endereços IP](#private-content-custom-policy-statement-example-all-objects)
+ [Exemplo de declaração de política: acessar todos os arquivos associados a um ID de par de chaves de um endereço IP](#private-content-custom-policy-statement-example-one-ip)

### Exemplo de declaração de política: acessar um arquivo de um intervalo de endereços IP
<a name="private-content-custom-policy-statement-example-one-object"></a>

O exemplo a seguir de política personalizada em um signed URL especifica que um usuário pode acessar o arquivo `https://d111111abcdef8.cloudfront.net/game_download.zip` de endereços IP no intervalo `192.0.2.0/24` até 31 de janeiro de 2023, 10h UTC:

```
{
    "Statement": [
        {
            "Resource": "https://d111111abcdef8.cloudfront.net/game_download.zip",
            "Condition": {
                "IpAddress": {
                    "AWS:SourceIp": "192.0.2.0/24"
                },
                "DateLessThan": {
                    "AWS:EpochTime": 1675159200
                }
            }
        }
    ]
}
```

### Exemplo de declaração de política: acessar todos os arquivos de um diretório em um intervalo de endereços IP
<a name="private-content-custom-policy-statement-example-all-objects"></a>

O exemplo a seguir de política personalizada permite criar signed URLs para qualquer arquivo no diretório `training`, conforme indicado pelo caractere curinga (`*`) no parâmetro `Resource`. Os usuários podem acessar o arquivo de um endereço IP no intervalo `192.0.2.0/24` até 31 de janeiro de 2023, 10h UTC:

```
{
    "Statement": [
        {
            "Resource": "https://d111111abcdef8.cloudfront.net/training/*",
            "Condition": {
                "IpAddress": {
                    "AWS:SourceIp": "192.0.2.0/24"
                },
                "DateLessThan": {
                    "AWS:EpochTime": 1675159200
                }
            }
        }
    ]
}
```

Cada signed URL com o qual você usa essa política tem um URL que identifica um arquivo específico, por exemplo:

`https://d111111abcdef8.cloudfront.net/training/orientation.pdf`

### Exemplo de declaração de política: acessar todos os arquivos associados a um ID de par de chaves de um endereço IP
<a name="private-content-custom-policy-statement-example-one-ip"></a>

O exemplo de política personalizada a seguir permite que você crie signed URLs para qualquer arquivo associado a qualquer distribuição, conforme indicado pelo caractere curinga `*` no parâmetro `Resource`. O signed URL deve usar o protocolo `https://`, não o `http://`. O usuário deve usar o endereço IP `192.0.2.10/32`. (O valor `192.0.2.10/32` na notação CIDR se refere a um único endereço IP, `192.0.2.10`.) Os arquivos estão disponíveis somente de 31 de janeiro de 2023, 10h UTC, a 2 de fevereiro de 2023, 10h UTC:

```
{
    "Statement": [
       {
            "Resource": "https://*",
            "Condition": {
                "IpAddress": {
                    "AWS:SourceIp": "192.0.2.10/32"
                },
                "DateGreaterThan": {
                    "AWS:EpochTime": 1675159200
                },
                "DateLessThan": {
                    "AWS:EpochTime": 1675332000
                }
            }
        }
    ]
}
```

Cada signed URL com o qual você usa essa política tem um URL que identifica um arquivo específico em uma distribuição específica do CloudFront, por exemplo:

`https://d111111abcdef8.cloudfront.net/training/orientation.pdf`

O signed URL também inclui um ID de par de chaves, que deve estar associado a um grupo de chaves confiável na distribuição (d111111abcdef8.cloudfront.net) especificada no URL.

## Criar uma assinatura para um URL que use uma política personalizada
<a name="private-content-custom-policy-creating-signature"></a>

A assinatura de um signed URL que usa uma política personalizada é uma versão da declaração de política com hash, assinada e codificada em base64. Para criar uma assinatura para uma política personalizada, conclua as etapas a seguir.

Para obter mais informações e exemplos de como adicionar hash, assinar e codificar a declaração de política, consulte:
+ [Comandos do Linux e OpenSSL para criptografia e codificação base64](private-content-linux-openssl.md)
+ [Exemplos de código para criar uma assinatura para um signed URL](PrivateCFSignatureCodeAndExamples.md)<a name="private-content-custom-policy-creating-signature-download-procedure"></a>

**Opção 1: Como criar uma assinatura usando uma política personalizada**

1. Use a função de hash SHA-1 e a chave privada RSA ou ECDSA gerada para assinar e adicionar um hash JSON à declaração de política criada no procedimento [Para criar a declaração de política para um signed URL que usa uma política personalizada](#private-content-custom-policy-creating-policy-procedure). Use a versão da declaração de política que não inclui mais espaços em branco, mas que ainda não foi codificada em base64.

   Para a chave privada exigida pela função hash, use uma chave privada que tenha a chave pública em um grupo de chaves confiável ativo para a distribuição.
**nota**  
O método usado para assinar e adicionar um hash à declaração de política depende da sua linguagem de programação e plataforma. Para obter o código de exemplo, consulte [Exemplos de código para criar uma assinatura para um signed URL](PrivateCFSignatureCodeAndExamples.md).

1. Remova os espaços em branco (inclusive caracteres de nova linha e de tabulação) da string assinada e com hash.

1. Codifique a string usando codificação base64 MIME. Para obter mais informações, consulte [Section 6.8, Base64 Content-Transfer-Encoding](https://tools.ietf.org/html/rfc2045#section-6.8) em *RFC 2045, MIME (Multipurpose Internet Mail Extensions) Part One: Format of Internet Message Bodies*.

1. Substitua os caracteres inválidos da query string de um URL por caracteres válidos. A tabela a seguir indica os caracteres válidos e inválidos.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-custom-policy.html)

1. Inclua o valor resultante no seu signed URL depois de `&Signature=` e volte para [Para criar um signed URL usando uma política personalizada](#private-content-creating-signed-url-custom-policy-procedure) para concluir a concatenação das partes dele.

# Usar cookies assinados
<a name="private-content-signed-cookies"></a>

Os signed cookies do CloudFront permitem controlar quem pode acessar seu conteúdo quando você não quiser alterar seus URLs atuais ou quando quiser fornecer acesso a vários arquivos restritos, por exemplo, todos os arquivos da área de assinantes de um site. Este tópico explica as considerações ao usar signed cookies e descreve como defini-los usando políticas padrão e personalizadas.

**Topics**
+ [Decidir usar políticas predefinidas ou personalizadas para cookies assinados](#private-content-choosing-canned-custom-cookies)
+ [Como signed cookies funcionam](#private-content-how-signed-cookies-work)
+ [Evitar o uso indevido de cookies assinados](#private-content-signed-cookie-misuse)
+ [Quando o CloudFront confere a data e hora de validade de um cookie assinado](#private-content-check-expiration-cookie)
+ [Código de exemplo e ferramentas de terceiros](#private-content-overview-sample-code-cookies)
+ [Definir cookies assinados usando uma política predefinida](private-content-setting-signed-cookie-canned-policy.md)
+ [Definir cookies assinados usando uma política personalizada](private-content-setting-signed-cookie-custom-policy.md)
+ [Criar cookies assinados usando PHP](signed-cookies-PHP.md)

## Decidir usar políticas predefinidas ou personalizadas para cookies assinados
<a name="private-content-choosing-canned-custom-cookies"></a>

Ao criar um signed cookie, você grava uma declaração de política no formato JSON que especifica as restrições no signed cookie, por exemplo, por quanto tempo o cookie é válido. Você pode usar políticas padrão ou personalizadas. A tabela a seguir compara as políticas personalizadas e padrão:


****  

| Descrição | Política padrão | Política personalizada | 
| --- | --- | --- | 
| Você pode reutilizar a declaração de política para vários arquivos. Para reutilizar a declaração de política, é necessário usar caracteres curinga no objeto `Resource`. Para obter mais informações, consulte [Valores especificados na declaração de uma política personalizada para signed cookies](private-content-setting-signed-cookie-custom-policy.md#private-content-custom-policy-statement-cookies-values).)  | Não | Sim | 
| Você pode especificar a data e a hora em que os usuários podem começar a acessar seu conteúdo | Não | Sim (opcional) | 
| Você pode especificar a data e a hora em que os usuários não podem mais acessar seu conteúdo | Sim | Sim | 
| Você pode especificar o endereço IP ou vários endereços IP dos usuários que podem acessar seu conteúdo | Não | Sim (opcional) | 

Para obter informações sobre como criar signed cookies usando uma política padrão, consulte [Definir cookies assinados usando uma política predefinida](private-content-setting-signed-cookie-canned-policy.md).

Para obter informações sobre como criar signed cookies usando uma política personalizada, consulte [Definir cookies assinados usando uma política personalizada](private-content-setting-signed-cookie-custom-policy.md).

## Como signed cookies funcionam
<a name="private-content-how-signed-cookies-work"></a>

A seguir, uma visão geral de como configurar o CloudFront para signed cookies e como o CloudFront responde quando um usuário envia uma solicitação que contenha um signed cookie. 

1. Na sua distribuição do CloudFront, especifique um ou mais grupos de chaves confiáveis, que contenham as chaves públicas que o CloudFront pode usar para verificar a assinatura do URL. Use as chaves privadas correspondentes para assinar os URLs.

   Para obter mais informações, consulte [Especificar os assinantes que podem criar URLs e cookies assinados](private-content-trusted-signers.md).

1. Desenvolva seu aplicativo para determinar se um usuário deve ter acesso a seu conteúdo e, em caso afirmativo, para enviar três cabeçalhos `Set-Cookie` para o visualizador. (Cada cabeçalho `Set-Cookie` pode conter somente um par de nome/valor, e um signed cookie do CloudFront requer três pares de nome/valor.) Você deve enviar os cabeçalhos `Set-Cookie` para o visualizador antes de ele solicitar o conteúdo privado. Se você definir uma hora de expiração breve no cookie, envie mais três cabeçalhos `Set-Cookie` em resposta a solicitações subsequentes para que o usuário continue tendo acesso.

   Normalmente, a distribuição do CloudFront terá pelo menos dois comportamentos de cache: um que não exige autenticação e um que exige. A página de erro da parte segura do site inclui um redirecionador ou link para uma página de login.

   Se você configurar sua distribuição para armazenar arquivos em cache com base em cookies, o CloudFront não armazenará arquivos separados com base nos atributos nos signed cookies.

1. Um usuário faz login em seu site e paga pelo conteúdo ou cumpre outro requisito de acessar.

1. O aplicativo retorna os cabeçalhos `Set-Cookie` na resposta, e o visualizador armazena os pares de nome-valor.

1. O usuário solicita um arquivo.

   O navegador do usuário ou outro visualizador obtém os pares de nome-valor da etapa 4 e os adiciona à solicitação em um cabeçalho `Cookie`. Esse é o signed cookie.

1. O CloudFront usa a chave pública para validar a assinatura no signed cookie e confirmar se o cookie não foi adulterado. Se a assinatura for inválida, a solicitação será rejeitada.

   Se a assinatura do cookie for válida, o CloudFront analisará a declaração de política no cookie (ou criará uma se você estiver usando uma política padrão) para confirmar se a solicitação continua válida. Por exemplo, se você especificou uma data e hora de início e término para o cookie, o CloudFront confirmará se o usuário está tentando acessar o conteúdo durante o período de acesso permitido.

   Se a solicitação cumprir os requisitos da declaração de política, o CloudFront fornecerá o conteúdo, como o faz com conteúdo não restrito: determina se o arquivo já está no ponto de presença de caches, encaminha a solicitação para a origem, se necessário, e retorna o arquivo para o usuário.

## Evitar o uso indevido de cookies assinados
<a name="private-content-signed-cookie-misuse"></a>

Se você especificar o parâmetro `Domain` em um cabeçalho `Set-Cookie`, especifique o valor mais preciso possível para reduzir o possível acesso por alguém com o mesmo nome de domínio raiz. Por exemplo, app.example.com é preferível a example.com, especialmente quando você não tem o controle sobre example.com. Isso ajuda a evitar que alguém acesse seu conteúdo de www.example.com.

Para ajudar a evitar esse tipo de ataque:
+ Exclua os atributos de cookie `Expires` e `Max-Age` para que o cabeçalho `Set-Cookie` crie um cookie de sessão. Cookies de sessão são automaticamente excluídos quando o usuário fecha o navegador, diminuindo a possibilidade de alguém obter acesso não autorizado ao seu conteúdo.
+ Inclua o atributo `Secure` para que o cookie seja criptografado quando o visualizador incluí-lo em uma solicitação.
+ Quando possível, use uma política personalizada e inclua o endereço IP do visualizador.
+ No atributo `CloudFront-Expires`, especifique o menor tempo de expiração razoável com base em quanto tempo você deseja que os usuários tenham acesso a seu conteúdo.

## Quando o CloudFront confere a data e hora de validade de um cookie assinado
<a name="private-content-check-expiration-cookie"></a>

Para determinar se um signed cookie continua válido, o CloudFront verifica a data e hora de expiração dele no momento da solicitação HTTP. Se um cliente começar a fazer download de um grande arquivo logo antes da hora de expiração, o download será concluído mesmo se passar a hora de expiração durante o download. Se a conexão TCP cair e o cliente tentar reiniciar o download após a hora de expiração, ocorrerá falha no download.

Se o cliente usar Range GETs para obter um arquivo em partes menores, ocorrerá falha em qualquer solicitação GET que ocorrer após a hora de expiração. Para obter mais informações sobre Range GETs, consulte [Como o CloudFront processa solicitações parciais de um objeto (Range GETs)](RangeGETs.md).

## Código de exemplo e ferramentas de terceiros
<a name="private-content-overview-sample-code-cookies"></a>

O código de exemplo do conteúdo privado mostra apenas como criar a assinatura para signed URLs. No entanto, o processo de criação de uma assinatura para um signed cookie é semelhante, ou seja, a maior parte do código de exemplo é relevante. Para saber mais, consulte os seguintes tópicos: 
+ [Criar uma assinatura de URL usando Perl](CreateURLPerl.md)
+ [Criar uma assinatura de URL usando PHP](CreateURL_PHP.md)
+ [Criar uma assinatura de URL usando C\$1 e o .NET Framework](CreateSignatureInCSharp.md)
+ [Criar uma assinatura de URL usando Java](CFPrivateDistJavaDevelopment.md)

# Definir cookies assinados usando uma política predefinida
<a name="private-content-setting-signed-cookie-canned-policy"></a>

Para definir um signed cookie usando uma política padrão, execute as seguintes etapas. Para criar a assinatura, consulte [Criar uma assinatura para um cookie assinado que use uma política predefinida](#private-content-canned-policy-signature-cookies).<a name="private-content-setting-signed-cookie-canned-policy-procedure"></a>

**Para definir um signed cookie usando uma política padrão**

1. Se estiver usando o .NET ou o Java para criar signed cookies e não tiver reformatado a chave privada de seu par de chaves do formato padrão .pem para um formato compatível com o .NET ou o Java, faça isso agora. Para obter mais informações, consulte [Reformatar a chave privada (somente .NET e Java)](private-content-trusted-signers.md#private-content-reformatting-private-key).

1. Programe seu aplicativo para enviar três cabeçalhos `Set-Cookie` para os visualizadores aprovados. São necessários três cabeçalhos `Set-Cookie` porque cada cabeçalho `Set-Cookie` pode conter somente um par de nome/valor, e um signed cookie do CloudFront requer três pares. Os pares de nome-valor são: `CloudFront-Expires`, `CloudFront-Signature` e `CloudFront-Key-Pair-Id`. Os valores devem estar presentes no visualizador antes de um usuário fazer a primeira solicitação de um arquivo ao qual você deseja controlar o acesso. 
**nota**  
Em geral, recomendamos que você exclua os atributos `Expires` e `Max-Age`. A exclusão dos atributos faz com que o navegador exclua o cookie quando o usuário fecha o navegador, diminuindo a possibilidade de alguém obter acesso não autorizado ao seu conteúdo. Para obter mais informações, consulte [Evitar o uso indevido de cookies assinados](private-content-signed-cookies.md#private-content-signed-cookie-misuse).

   **Os nomes dos atributos de cookie fazem distinção entre letras maiúsculas e minúsculas**. 

   As quebras de linha são incluídas apenas para tornar os atributos mais legíveis.

   ```
   Set-Cookie: 
   CloudFront-Expires=date and time in Unix time format (in seconds) and Coordinated Universal Time (UTC); 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   
   Set-Cookie: 
   CloudFront-Signature=hashed and signed version of the policy statement; 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   
   Set-Cookie: 
   CloudFront-Key-Pair-Id=public key ID for the CloudFront public key whose corresponding private key you're using to generate the signature; 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   ```  
**(Opcional) `Domain`**  
O nome de domínio do arquivo solicitado. Se você não especificar um atributo `Domain`, o valor padrão será o nome de domínio do URL, e ele se aplica apenas ao nome de domínio em questão, não aos subdomínios. Se você especificar um atributo `Domain`, ele também será aplicado aos subdomínios. Um ponto inicial no nome de domínio (por exemplo, `Domain=.example.com`) é opcional. Além disso, se você especificar um atributo `Domain`, o nome de domínio do URL e o valor do atributo `Domain` deverão ser correspondentes.  
É possível especificar o nome de domínio atribuído pelo CloudFront à sua distribuição, por exemplo, d111111abcdef8.cloudfront.net, mas é possível especificar \$1.cloudfront.net para o nome de domínio.  
Se você quiser usar um nome de domínio alternativo, como example.com nos URLs, deverá adicioná-lo à sua distribuição, independentemente de especificá-lo no atributo `Domain` ou não. Para obter mais informações, consulte [Nomes de domínio alternativos (CNAMEs)](DownloadDistValuesGeneral.md#DownloadDistValuesCNAME) no tópico [Referência de configurações de todas as distribuições](distribution-web-values-specify.md).  
**(Opcional) `Path`**  
O caminho do arquivo solicitado. Se você não especificar um atributo `Path`, o valor padrão será o caminho do URL.  
**`Secure`**  
Exige que o visualizador criptografe os cookies antes de enviar uma solicitação. Recomendamos que você envie o cabeçalho `Set-Cookie` por uma conexão HTTPS para garantir que os atributos de cookie estejam protegidos de ataques a intermediários.  
**`HttpOnly`**  
Define como o navegador (quando compatível) interage com o valor do cookie. Com `HttpOnly`, os valores dos cookies são inacessíveis ao JavaScript. Essa precaução pode ajudar a mitigar os ataques conhecidos como cross-site scripting (XSS). Consulte mais informações em [Using HTTP cookies](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies).  
**`CloudFront-Expires`**  
Especifique a data e hora de expiração no formato de hora do Unix (em segundos) e no Tempo Universal Coordenado (UTC). Por exemplo, 1.º de janeiro de 2026 10h UTC é convertido em 1357034400 no formato de hora do Unix.   
Para usar o tempo de época, especifique um número inteiro de 64 bits para uma data que não seja posterior a `9223372036854775807` (sexta-feira, 11 de abril de 2262 às 23:47:16.854 UTC).  
Para obter informações sobre UTC, consulte a *RFC 3339, Date and Time on the Internet: Timestamps*, [https://tools.ietf.org/html/rfc3339](https://tools.ietf.org/html/rfc3339).  
**`CloudFront-Signature`**  
Uma versão assinada, com hash e codificação base64 de uma declaração de política do JSON. Para obter mais informações, consulte [Criar uma assinatura para um cookie assinado que use uma política predefinida](#private-content-canned-policy-signature-cookies).  
**`CloudFront-Key-Pair-Id`**  
O ID de uma chave pública do CloudFront, por exemplo, `K2JCJMDEHXQW5F`. O ID da chave pública informa ao CloudFront qual chave pública deve ser usada para validar o signed URL. O CloudFront compara as informações da assinatura com as informações da declaração de política para verificar se o URL não foi adulterado.  
Essa chave pública deve pertencer a um grupo de chaves que seja um signatário confiável na distribuição. Para obter mais informações, consulte [Especificar os assinantes que podem criar URLs e cookies assinados](private-content-trusted-signers.md).

O exemplo a seguir mostra cabeçalhos de `Set-Cookie` de um signed cookie quando você está usando o nome de domínio associado à sua distribuição nas URLs de seus arquivos:

```
Set-Cookie: CloudFront-Expires=1426500000; Domain=d111111abcdef8.cloudfront.net; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=yXrSIgyQoeE4FBI4eMKF6ho~CA8_; Domain=d111111abcdef8.cloudfront.net; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=d111111abcdef8.cloudfront.net; Path=/images/*; Secure; HttpOnly
```

O exemplo a seguir mostra cabeçalhos de `Set-Cookie` de um signed cookie quando você está usando o nome de domínio alternativo example.org nas URLs de seus arquivos:

```
Set-Cookie: CloudFront-Expires=1426500000; Domain=example.org; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=yXrSIgyQoeE4FBI4eMKF6ho~CA8_; Domain=example.org; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=example.org; Path=/images/*; Secure; HttpOnly
```

Se você quiser usar um nome de domínio alternativo, como example.com nos URLs, deverá adicioná-lo à sua distribuição, independentemente de especificá-lo no atributo `Domain` ou não. Para obter mais informações, consulte [Nomes de domínio alternativos (CNAMEs)](DownloadDistValuesGeneral.md#DownloadDistValuesCNAME) no tópico [Referência de configurações de todas as distribuições](distribution-web-values-specify.md).

## Criar uma assinatura para um cookie assinado que use uma política predefinida
<a name="private-content-canned-policy-signature-cookies"></a>

Para criar a assinatura de um cookie que use uma política predefinida, siga estes procedimentos.

**Topics**
+ [Criar uma declaração de política para um cookie assinado que use uma política predefinida](#private-content-canned-policy-statement-cookies)
+ [Assinar a declaração de política para criar uma assinatura para um cookie assinado que use uma política predefinida](#private-content-canned-policy-cookies-signing-policy-statement)

### Criar uma declaração de política para um cookie assinado que use uma política predefinida
<a name="private-content-canned-policy-statement-cookies"></a>

Ao definir um signed cookie que usa uma política padrão, o atributo `CloudFront-Signature` será uma versão assinada e com hash de uma declaração de política. Para signed cookies que usam uma política padrão, a declaração de política não é incluída no cabeçalho `Set-Cookie`, como é feito nos signed cookies que usam uma política personalizada. Para criar a declaração de política, conclua as etapas a seguir.<a name="private-content-canned-policy-statement-cookies-procedure"></a>

**Para criar uma declaração de política para um signed cookie que usa uma política padrão**

1. Crie a declaração de política usando o formato JSON a seguir e a codificação de caracteres UTF-8. Inclua todas as pontuações e outros valores literais exatamente como especificado. Para obter informações sobre os parâmetros `Resource` e `DateLessThan`, consulte [Valores especificados na declaração de uma política padrão para signed cookies](#private-content-canned-policy-statement-cookies-values).

   ```
   {
       "Statement": [
           {
               "Resource": "base URL or stream name",
               "Condition": {
                   "DateLessThan": {
                       "AWS:EpochTime": ending date and time in Unix time format and UTC
                   }
               }
           }
       ]
   }
   ```

1. Remova todas os espaços em branco (inclusive caracteres de nova linha e de tabulação) da declaração de política. Pode ser necessário incluir caracteres de escape na string do código do aplicativo.

#### Valores especificados na declaração de uma política padrão para signed cookies
<a name="private-content-canned-policy-statement-cookies-values"></a>

Ao criar uma declaração de política para uma política padrão, especifique os valores a seguir:

**Recurso**  
O URL base, inclusive suas query strings, se houver, por exemplo:  
`https://d111111abcdef8.cloudfront.net/images/horizon.jpg?size=large&license=yes`  
Você pode especificar apenas um valor para `Resource`.  
Observe o seguinte:  
+ **Protocolo**: o valor deve começar com `http://` ou `https://`.
+ **Parâmetros de query string** :se você não tiver query strings, omita o ponto de interrogação.
+ **Nomes de domínio alternativos**: se especificar um nome de domínio alternativo (CNAME) no URL, você deverá especificá-lo ao fazer referência ao arquivo na sua página da web ou aplicação. Não especifique o URL do Amazon S3 para o arquivo.

**DateLessThan**  
A data e hora de expiração do URL no formato de hora do Unix (em segundos) e no Tempo Universal Coordenado (UTC). Não coloque os valores entre aspas.  
Por exemplo, 16 de março de 2015, 10h UTC é convertido para 1426500000 no formato de hora do Unix.  
Esse valor deve corresponder ao valor do atributo `CloudFront-Expires` no cabeçalho `Set-Cookie`. Não coloque os valores entre aspas.  
Para obter mais informações, consulte [Quando o CloudFront confere a data e hora de validade de um cookie assinado](private-content-signed-cookies.md#private-content-check-expiration-cookie).

#### Exemplo de declaração de política para uma política padrão
<a name="private-content-canned-policy-cookies-sample-policy-statement"></a>

Ao usar o seguinte exemplo de declaração de política em um signed cookie, um usuário pode acessar o arquivo `https://d111111abcdef8.cloudfront.net/horizon.jpg` até 16 de março de 2015, 10h UTC:

```
{
    "Statement": [
        {
            "Resource": "https://d111111abcdef8.cloudfront.net/horizon.jpg?size=large&license=yes",
            "Condition": {
                "DateLessThan": {
                    "AWS:EpochTime": 1426500000
                }
            }
        }
    ]
}
```

### Assinar a declaração de política para criar uma assinatura para um cookie assinado que use uma política predefinida
<a name="private-content-canned-policy-cookies-signing-policy-statement"></a>

Para criar o valor para o atributo `CloudFront-Signature` em um cabeçalho `Set-Cookie`, assine e adicione um hash à declaração de política criada em [Para criar uma declaração de política para um signed cookie que usa uma política padrão](#private-content-canned-policy-statement-cookies-procedure). 

Para obter mais informações e exemplos de como adicionar hash, assinar e codificar a declaração de política, consulte os seguintes tópicos:
+ [Comandos do Linux e OpenSSL para criptografia e codificação base64](private-content-linux-openssl.md)
+ [Exemplos de código para criar uma assinatura para um signed URL](PrivateCFSignatureCodeAndExamples.md)<a name="private-content-canned-policy-cookie-creating-signature-procedure"></a>

**Para criar uma assinatura para um signed cookie usando uma política padrão**

1. Use a função de hash SHA-1 e o RSA para assinar e adicionar um hash à declaração de política criada no procedimento [Para criar uma declaração de política para um signed cookie que usa uma política padrão](#private-content-canned-policy-statement-cookies-procedure). Use a versão da declaração de política que não inclui mais espaços em branco.

   Para a chave privada exigida pela função hash, use uma chave privada que tenha a chave pública em um grupo de chaves confiável ativo para a distribuição.
**nota**  
O método usado para assinar e adicionar um hash à declaração de política depende da sua linguagem de programação e plataforma. Para obter o código de exemplo, consulte [Exemplos de código para criar uma assinatura para um signed URL](PrivateCFSignatureCodeAndExamples.md).

1. Remova os espaços em branco (inclusive caracteres de nova linha e de tabulação) da string assinada e com hash.

1. Codifique a string usando codificação base64 MIME. Para obter mais informações, consulte [Section 6.8, Base64 Content-Transfer-Encoding](https://tools.ietf.org/html/rfc2045#section-6.8) em *RFC 2045, MIME (Multipurpose Internet Mail Extensions) Part One: Format of Internet Message Bodies*.

1. Substitua os caracteres inválidos da query string de um URL por caracteres válidos. A tabela a seguir indica os caracteres válidos e inválidos.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/AmazonCloudFront/latest/DeveloperGuide/private-content-setting-signed-cookie-canned-policy.html)

1. Inclua o valor resultante no cabeçalho `Set-Cookie` para o par de nome-valor `CloudFront-Signature`. Em seguida, volte para [Para definir um signed cookie usando uma política padrão](#private-content-setting-signed-cookie-canned-policy-procedure) e adicione o cabeçalho `Set-Cookie` em `CloudFront-Key-Pair-Id`.

# Definir cookies assinados usando uma política personalizada
<a name="private-content-setting-signed-cookie-custom-policy"></a>

Para definir um signed cookie que usa uma política personalizada, execute as etapas a seguir.<a name="private-content-setting-signed-cookie-custom-policy-procedure"></a>

**Para definir um signed cookie usando uma política personalizada**

1. Se você estiver usando o .NET ou Java para criar signed URLs e não tiver reformatado a chave privada do seu par de chaves para do formato padrão .pem para um formato compatível com o .NET ou Java, faça isso agora. Para obter mais informações, consulte [Reformatar a chave privada (somente .NET e Java)](private-content-trusted-signers.md#private-content-reformatting-private-key).

1. Programe seu aplicativo para enviar três cabeçalhos `Set-Cookie` para os visualizadores aprovados. São necessários três cabeçalhos `Set-Cookie` porque cada cabeçalho `Set-Cookie` pode conter somente um par de nome/valor, e um signed cookie do CloudFront requer três pares. Os pares de nome-valor são: `CloudFront-Policy`, `CloudFront-Signature` e `CloudFront-Key-Pair-Id`. Os valores devem estar presentes no visualizador antes de um usuário fazer a primeira solicitação de um arquivo ao qual você deseja controlar o acesso. 
**nota**  
Em geral, recomendamos que você exclua os atributos `Expires` e `Max-Age`. Isso faz com que o navegador exclua o cookie quando o usuário fecha o navegador, diminuindo a possibilidade de alguém obter acesso não autorizado ao seu conteúdo. Para obter mais informações, consulte [Evitar o uso indevido de cookies assinados](private-content-signed-cookies.md#private-content-signed-cookie-misuse).

   **Os nomes dos atributos de cookie fazem distinção entre letras maiúsculas e minúsculas**. 

   As quebras de linha são incluídas apenas para tornar os atributos mais legíveis.

   ```
   Set-Cookie: 
   CloudFront-Policy=base64 encoded version of the policy statement; 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   
   
   Set-Cookie: 
   CloudFront-Signature=hashed and signed version of the policy statement; 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   
   Set-Cookie: 
   CloudFront-Key-Pair-Id=public key ID for the CloudFront public key whose corresponding private key you're using to generate the signature; 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   ```  
**(Opcional) `Domain`**  
O nome de domínio do arquivo solicitado. Se você não especificar um atributo `Domain`, o valor padrão será o nome de domínio do URL, e ele se aplica apenas ao nome de domínio em questão, não aos subdomínios. Se você especificar um atributo `Domain`, ele também será aplicado aos subdomínios. Um ponto inicial no nome de domínio (por exemplo, `Domain=.example.com`) é opcional. Além disso, se você especificar um atributo `Domain`, o nome de domínio do URL e o valor do atributo `Domain` deverão ser correspondentes.  
É possível especificar o nome de domínio atribuído pelo CloudFront à sua distribuição, por exemplo, d111111abcdef8.cloudfront.net, mas é possível especificar \$1.cloudfront.net para o nome de domínio.  
Se você quiser usar um nome de domínio alternativo, como example.com nos URLs, deverá adicioná-lo à sua distribuição, independentemente de especificá-lo no atributo `Domain` ou não. Para obter mais informações, consulte [Nomes de domínio alternativos (CNAMEs)](DownloadDistValuesGeneral.md#DownloadDistValuesCNAME) no tópico [Referência de configurações de todas as distribuições](distribution-web-values-specify.md).  
**(Opcional) `Path`**  
O caminho do arquivo solicitado. Se você não especificar um atributo `Path`, o valor padrão será o caminho do URL.  
**`Secure`**  
Exige que o visualizador criptografe os cookies antes de enviar uma solicitação. Recomendamos que você envie o cabeçalho `Set-Cookie` por uma conexão HTTPS para garantir que os atributos de cookie estejam protegidos de ataques a intermediários.  
**`HttpOnly`**  
Exige que o visualizador envie o cookie apenas em solicitações HTTP ou HTTPS.  
**`CloudFront-Policy`**  
Sua declaração de política no formato JSON, sem espaços em branco e com codificação base64. Para obter mais informações, consulte [Criar uma assinatura para um cookie assinado que use uma política personalizada](#private-content-custom-policy-signature-cookies).  
A declaração de política controla o acesso que um signed cookie concede a um usuário. Ela inclui os arquivos que o usuário pode acessar, uma data e hora de expiração, uma data e hora opcionais em que o URL se torna válido e um endereço IP opcional ou intervalo de endereços IP que tenham permissão para acessar o arquivo.  
**`CloudFront-Signature`**  
Uma versão assinada, com hash e codificação base64 da declaração de política do JSON. Para obter mais informações, consulte [Criar uma assinatura para um cookie assinado que use uma política personalizada](#private-content-custom-policy-signature-cookies).  
**`CloudFront-Key-Pair-Id`**  
O ID de uma chave pública do CloudFront, por exemplo, `K2JCJMDEHXQW5F`. O ID da chave pública informa ao CloudFront qual chave pública deve ser usada para validar o signed URL. O CloudFront compara as informações da assinatura com as informações da declaração de política para verificar se o URL não foi adulterado.  
Essa chave pública deve pertencer a um grupo de chaves que seja um signatário confiável na distribuição. Para obter mais informações, consulte [Especificar os assinantes que podem criar URLs e cookies assinados](private-content-trusted-signers.md).

## Exemplos de cabeçalhos `Set-Cookie` para políticas personalizadas
<a name="example-set-cookie-headers-custom-policy"></a>

Veja os exemplos a seguir de pares de cabeçalhos `Set-Cookie`. 

Se quiser usar um nome de domínio alternativo, como exemplo.org nos URLs, deverá adicioná-lo à sua distribuição, independentemente de especificá-lo no atributo `Domain` ou não. Para saber mais, consulte [Nomes de domínio alternativos (CNAMEs)](DownloadDistValuesGeneral.md#DownloadDistValuesCNAME) no tópico [Referência de configurações de todas as distribuições](distribution-web-values-specify.md).

**Example Exemplo 1**  
É possível usar os cabeçalhos `Set-Cookie` de um signed cookie quando estiver usando o nome de domínio associado à sua distribuição nos URLs dos seus arquivos.  

```
Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
```

**Example Exemplo 2**  
É possível usar cabeçalhos `Set-Cookie` de um signed cookie quando você estiver usando um nome de domínio alternativo (exemplo.org) nos URLs dos seus arquivos.  

```
Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=example.org; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=example.org; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=example.org; Path=/; Secure; HttpOnly
```

**Example Exemplo 3**  
É possível usar os pares de cabeçalho `Set-Cookie` de uma solicitação assinada quando estiver usando o nome de domínio associado à sua distribuição nos URLs dos seus arquivos.  

```
Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=dd111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
```

**Example Exemplo 4**  
É possível usar os pares de cabeçalho `Set-Cookie` de uma solicitação assinada quando estiver usando um nome de domínio alternativo (exemplo.org) associado à sua distribuição nos URLs dos seus arquivos.  

```
Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=example.org; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=example.org; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=example.org; Path=/; Secure; HttpOnly
```

## Criar uma declaração de política para um cookie assinado que use uma política personalizada
<a name="private-content-custom-policy-statement-cookies"></a>

Para criar uma declaração de política para uma política personalizada, conclua as etapas a seguir. Para obter vários exemplos de declaração de política que controlam o acesso a arquivos de diversas formas, consulte [Exemplos de declaração de política para um signed cookie que usa uma política personalizada](#private-content-custom-policy-statement-signed-cookies-examples).<a name="private-content-custom-policy-statement-cookies-procedure"></a>

**Para criar a declaração de política para um signed cookie que usa uma política personalizada**

1. Crie a declaração de política usando o formato JSON a seguir.

   ```
   {
       "Statement": [
           {
               "Resource": "URL of the file",
               "Condition": {
                   "DateLessThan": {
                       "AWS:EpochTime":required ending date and time in Unix time format and UTC
                   },
                   "DateGreaterThan": {
                       "AWS:EpochTime":optional beginning date and time in Unix time format and UTC
                   },
                   "IpAddress": {
                       "AWS:SourceIp": "optional IP address"
                   }
               }
           }
       ]
   }
   ```

   Observe o seguinte:
   + Você pode incluir apenas uma instrução.
   + Use a codificação de caracteres UTF-8.
   + Inclua todas as pontuações e nomes de parâmetro exatamente como especificado. Abreviações de nomes de parâmetro não são aceitas.
   + A ordem dos parâmetros na seção `Condition` não é importante.
   + Para obter informações sobre os valores de `Resource`, `DateLessThan`, `DateGreaterThan` e `IpAddress`, consulte [Valores especificados na declaração de uma política personalizada para signed cookies](#private-content-custom-policy-statement-cookies-values).

1. Remova todas os espaços em branco (inclusive caracteres de nova linha e de tabulação) da declaração de política. Pode ser necessário incluir caracteres de escape na string do código do aplicativo.

1. Codifique a declaração de política usando codificação base64 MIME. Para obter mais informações, consulte [Section 6.8, Base64 Content-Transfer-Encoding](https://tools.ietf.org/html/rfc2045#section-6.8) em *RFC 2045, MIME (Multipurpose Internet Mail Extensions) Part One: Format of Internet Message Bodies*.

1. Substitua os caracteres inválidos da query string de um URL por caracteres válidos. A tabela a seguir indica os caracteres válidos e inválidos.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/AmazonCloudFront/latest/DeveloperGuide/private-content-setting-signed-cookie-custom-policy.html)

1. Inclua o valor resultante em seu cabeçalho `Set-Cookie` depois de `CloudFront-Policy=`.

1. Crie uma assinatura para o cabeçalho `Set-Cookie` em `CloudFront-Signature` adicionando hash, assinando e codificando em base64 a declaração de política. Para obter mais informações, consulte [Criar uma assinatura para um cookie assinado que use uma política personalizada](#private-content-custom-policy-signature-cookies).

### Valores especificados na declaração de uma política personalizada para signed cookies
<a name="private-content-custom-policy-statement-cookies-values"></a>

Ao criar uma declaração de política para uma política personalizada, especifique os valores a seguir.

**Recurso**  
O URL base, inclusive suas query strings, se houver:  
`https://d111111abcdef8.cloudfront.net/images/horizon.jpg?size=large&license=yes`  
Se você omitir o parâmetro `Resource`, os usuários poderão acessar todos os arquivos associados a qualquer distribuição associada ao par de chaves usado para criar o signed URL.
Você pode especificar apenas um valor para `Resource`.  
Observe o seguinte:  
+ **Protocolo**: o valor deve começar com `http://` ou `https://`.
+ **Parâmetros de query string** :se você não tiver query strings, omita o ponto de interrogação.
+ **Curingas**: é possível usar o caractere curinga que corresponde a zero ou mais caracteres (\$1) ou o caractere curinga que corresponde a exatamente um caractere (?) em qualquer lugar na string. Por exemplo, o valor:

  `https://d111111abcdef8.cloudfront.net/*game_download.zip*`

  incluiria os seguintes arquivos:
  + `https://d111111abcdef8.cloudfront.net/game_download.zip`
  + `https://d111111abcdef8.cloudfront.net/example_game_download.zip?license=yes`
  + `https://d111111abcdef8.cloudfront.net/test_game_download.zip?license=temp`
+ **Nomes de domínio alternativos**: se especificar um nome de domínio alternativo (CNAME) no URL, você deverá especificá-lo ao fazer referência ao arquivo na sua página da web ou aplicação. Não especifique o URL do Amazon S3 para o arquivo.

**DateLessThan**  
A data e hora de expiração do URL no formato de hora do Unix (em segundos) e no Tempo Universal Coordenado (UTC). Não coloque os valores entre aspas.  
Por exemplo, 16 de março de 2015, 10h UTC é convertido para 1426500000 no formato de hora do Unix.  
Para obter mais informações, consulte [Quando o CloudFront confere a data e hora de validade de um cookie assinado](private-content-signed-cookies.md#private-content-check-expiration-cookie).

**DateGreaterThan (opcional)**  
Uma data e hora de início opcional do URL no formato de hora do Unix (em segundos) e no Tempo Universal Coordenado (UTC). Os usuários não podem acessar o arquivo antes ou na data e hora especificadas. Não coloque os valores entre aspas. 

**IpAddress (opcional)**  
O endereço IP do cliente que está fazendo a solicitação GET. Observe o seguinte:  
+ Para permitir o acesso de qualquer endereço IP ao arquivo, omita o parâmetro `IpAddress`.
+ Você pode especificar um ou vários endereços IP. Por exemplo, você não pode definir que a política permita o acesso se o endereço IP do cliente estiver em um de dois intervalos separados.
+ Para permitir o acesso de um único endereço IP, especifique:

  `"`*IPv4 IP address*`/32"`
+ Você deve especificar os intervalos de endereço IP no formato CIDR IPv4 padrão (por exemplo, `192.0.2.0/24`). Para obter mais informações, acesse a *RFC 4632, Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan*, [https://tools.ietf.org/html/rfc4632](https://tools.ietf.org/html/rfc4632).
**Importante**  
Endereços IP no formato IPv6, como 2001:0db8:85a3::8a2e:0370:7334, não são compatíveis. 

  Se você estiver usando uma política personalizada que inclui `IpAddress`, não permita o IPv6 para a distribuição. Se você quiser restringir o acesso a um conteúdo por endereço IP e oferecer suporte a solicitações IPv6 para outro tipo de conteúdo, crie duas distribuições. Para obter mais informações, consulte [Habilitar IPv6 (solicitações do visualizador)](DownloadDistValuesGeneral.md#DownloadDistValuesEnableIPv6) no tópico [Referência de configurações de todas as distribuições](distribution-web-values-specify.md).

## Exemplos de declaração de política para um signed cookie que usa uma política personalizada
<a name="private-content-custom-policy-statement-signed-cookies-examples"></a>

Os exemplos de declaração de política a seguir mostram como controlar o acesso a um arquivo específico, todos os arquivos de um diretório ou todos os arquivos associados a um ID de par de chaves. Os exemplos também mostram como controlar o acesso de um único endereço IP ou um intervalo de endereços IP e como evitar que os usuários usem o signed cookie após a data e hora especificadas.

Se você copiar e colar qualquer um desses exemplos, remova os espaços em branco (inclusive caracteres de nova linha e de tabulação), substitua os valores pelos seus próprios valores e inclua um caractere de nova linha após a chave de fechamento ( \$1 ).

Para obter mais informações, consulte [Valores especificados na declaração de uma política personalizada para signed cookies](#private-content-custom-policy-statement-cookies-values).

**Topics**
+ [Exemplo de declaração de política: acessar um arquivo de um intervalo de endereços IP](#private-content-custom-policy-statement-signed-cookies-example-one-object)
+ [Exemplo de declaração de política: acessar todos os arquivos de um diretório em um intervalo de endereços IP](#private-content-custom-policy-statement-signed-cookies-example-all-objects)
+ [Exemplo de declaração de política: acessar todos os arquivos associados a um ID de par de chaves de um endereço IP](#private-content-custom-policy-statement-signed-cookies-example-one-ip)

### Exemplo de declaração de política: acessar um arquivo de um intervalo de endereços IP
<a name="private-content-custom-policy-statement-signed-cookies-example-one-object"></a>

O exemplo a seguir de política personalizada em um signed cookie especifica que um usuário pode acessar o arquivo `https://d111111abcdef8.cloudfront.net/game_download.zip` de endereços IP no intervalo `192.0.2.0/24` até 1.º de janeiro de 2023, 10h UTC:

```
{
    "Statement": [
        {
            "Resource": "https://d111111abcdef8.cloudfront.net/game_download.zip",
            "Condition": {
                "IpAddress": {
                    "AWS:SourceIp": "192.0.2.0/24"
                },
                "DateLessThan": {
                    "AWS:EpochTime": 1767290400
                }
            }
        }
    ]
}
```

### Exemplo de declaração de política: acessar todos os arquivos de um diretório em um intervalo de endereços IP
<a name="private-content-custom-policy-statement-signed-cookies-example-all-objects"></a>

O exemplo a seguir de política personalizada permite criar signed cookies para qualquer arquivo no diretório `training`, conforme indicado pelo caractere curinga "\$1" no parâmetro `Resource`. Os usuários podem acessar o arquivo de um endereço IP no intervalo `192.0.2.0/24` até 1º de janeiro de 2013, 10h UTC:

```
{
    "Statement": [
        {
            "Resource": "https://d111111abcdef8.cloudfront.net/training/*",
            "Condition": {
                "IpAddress": {
                    "AWS:SourceIp": "192.0.2.0/24"
                },
                "DateLessThan": {
                    "AWS:EpochTime": 1767290400
                }
            }
        }
    ]
}
```

Cada signed cookie em que você usa essa política inclui um URL base que identifica um arquivo específico, por exemplo:

`https://d111111abcdef8.cloudfront.net/training/orientation.pdf`

### Exemplo de declaração de política: acessar todos os arquivos associados a um ID de par de chaves de um endereço IP
<a name="private-content-custom-policy-statement-signed-cookies-example-one-ip"></a>

O exemplo a seguir de política personalizada permite definir signed cookies para qualquer arquivo associado a qualquer distribuição, conforme indicado pelo caractere curinga "\$1" no parâmetro `Resource`. O usuário deve usar o endereço IP `192.0.2.10/32`. (O valor `192.0.2.10/32` na notação CIDR se refere a um único endereço IP, `192.0.2.10`.) Os arquivos estão disponíveis apenas de 1º de janeiro de 2013, 10h UTC, a 2 de janeiro de 2013, 10h UTC:

```
{
    "Statement": [
        {
            "Resource": "https://*",
            "Condition": {
                "IpAddress": {
                    "AWS:SourceIp": "192.0.2.10/32"
                },
                "DateGreaterThan": {
                    "AWS:EpochTime": 1767290400
                },
                "DateLessThan": {
                    "AWS:EpochTime": 1767376800
                }
            }
        }
    ]
}
```

Cada signed cookie em que você usa essa política inclui um URL base que identifica um arquivo específico em uma distribuição específica do CloudFront, por exemplo:

`https://d111111abcdef8.cloudfront.net/training/orientation.pdf`

O signed cookie também inclui o ID de um par de chaves, que deve estar associado a um grupo de chaves confiável na distribuição (d111111abcdef8.cloudfront.net) especificada no URL base.

## Criar uma assinatura para um cookie assinado que use uma política personalizada
<a name="private-content-custom-policy-signature-cookies"></a>

A assinatura de um signed cookie que usa uma política personalizada é uma versão da declaração de política com hash, assinada e codificada em base64. 

Para obter mais informações e exemplos de como adicionar hash, assinar e codificar a declaração de política, consulte:
+ [Comandos do Linux e OpenSSL para criptografia e codificação base64](private-content-linux-openssl.md)
+ [Exemplos de código para criar uma assinatura para um signed URL](PrivateCFSignatureCodeAndExamples.md)<a name="private-content-custom-policy-signature-cookies-procedure"></a>

**Para criar uma assinatura para um signed cookie usando uma política personalizada**

1. Use a função de hash SHA-1 e o RSA para assinar e adicionar um hash à declaração de política do JSON criada no procedimento [Para criar a declaração de política para um signed URL que usa uma política personalizada](private-content-creating-signed-url-custom-policy.md#private-content-custom-policy-creating-policy-procedure). Use a versão da declaração de política que não inclui mais espaços em branco, mas que ainda não foi codificada em base64.

   Para a chave privada exigida pela função hash, use uma chave privada que tenha a chave pública em um grupo de chaves confiável ativo para a distribuição.
**nota**  
O método usado para assinar e adicionar um hash à declaração de política depende da sua linguagem de programação e plataforma. Para obter o código de exemplo, consulte [Exemplos de código para criar uma assinatura para um signed URL](PrivateCFSignatureCodeAndExamples.md).

1. Remova os espaços em branco (inclusive caracteres de nova linha e de tabulação) da string assinada e com hash.

1. Codifique a string usando codificação base64 MIME. Para obter mais informações, consulte [Section 6.8, Base64 Content-Transfer-Encoding](https://tools.ietf.org/html/rfc2045#section-6.8) em *RFC 2045, MIME (Multipurpose Internet Mail Extensions) Part One: Format of Internet Message Bodies*.

1. Substitua os caracteres inválidos da query string de um URL por caracteres válidos. A tabela a seguir indica os caracteres válidos e inválidos.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/AmazonCloudFront/latest/DeveloperGuide/private-content-setting-signed-cookie-custom-policy.html)

1. Inclua o valor resultante no cabeçalho `Set-Cookie` para o par de nome-valor `CloudFront-Signature=` e volte para [Para definir um signed cookie usando uma política personalizada](#private-content-setting-signed-cookie-custom-policy-procedure) adicionar o cabeçalho `Set-Cookie` em `CloudFront-Key-Pair-Id`.

# Criar cookies assinados usando PHP
<a name="signed-cookies-PHP"></a>

O exemplo de código a seguir é semelhante ao exemplo em [Criar uma assinatura de URL usando PHP](CreateURL_PHP.md), em que ele cria um link para um vídeo. No entanto, em vez de assinar o URL no código, esse exemplo assina os cookies com a função `create_signed_cookies()`. O player do lado do cliente usa os cookies para autenticar cada solicitação à distribuição do CloudFront.

Essa abordagem é útil para transmitir conteúdo, como HTTP Live Streaming (HLS) ou Dynamic Adaptive Streaming over HTTP (DASH), em que o cliente precisa fazer várias solicitações para recuperar o manifesto, os segmentos e os ativos de reprodução relacionados. Ao usar cookies assinados, o cliente pode autenticar cada solicitação sem precisar gerar um novo URL assinado para cada segmento. 

**nota**  
A criação de uma assinatura de URL é apenas uma parte do processo de fornecimento de conteúdo privado por meio de cookies assinados. Para obter mais informações, consulte [Usar cookies assinados](private-content-signed-cookies.md).



**Topics**
+ [Criar a assinatura RSA SHA-1](#create-rsa-sha-1signature-cookies)
+ [Criar os cookies assinados](#create-the-signed-cookie)
+ [Código completo](#full-code-signed-cookies)

As seções a seguir dividem o exemplo de código em partes individuais. Você pode encontrar o [exemplo de código](#full-code-signed-cookies) completo abaixo.

## Criar a assinatura RSA SHA-1
<a name="create-rsa-sha-1signature-cookies"></a>

Este exemplo faz o seguinte:

1. A função `rsa_sha1_sign` cria o hash e assina a declaração de política. Os argumentos necessários são uma declaração de política e a chave privada que corresponde a uma chave pública que está em um grupo de chaves confiável para sua distribuição.

1. Em seguida, a função `url_safe_base64_encode` cria uma versão da assinatura segura para URL.

   ```
   function rsa_sha1_sign($policy, $private_key_filename) {
       $signature = "";
       $fp = fopen($private_key_filename, "r");
       $priv_key = fread($fp, 8192);
       fclose($fp);
       $pkeyid = openssl_get_privatekey($priv_key);
       openssl_sign($policy, $signature, $pkeyid);
       openssl_free_key($pkeyid);
       return $signature;
   }
   
   function url_safe_base64_encode($value) {
       $encoded = base64_encode($value);
       return str_replace(
           array('+', '=', '/'),
           array('-', '_', '~'),
           $encoded);
   }
   ```

## Criar os cookies assinados
<a name="create-the-signed-cookie"></a>

O código a seguir constrói e cria os cookies assinados, usando os seguintes atributos de cookie: `CloudFront-Expires`, `CloudFront-Signature` e `CloudFront-Key-Pair-Id`. O código usa uma política personalizada.

```
function create_signed_cookies($resource, $private_key_filename, $key_pair_id, $expires, $client_ip = null) {
    $policy = array(
        'Statement' => array(
            array(
                'Resource' => $resource,
                'Condition' => array(
                    'DateLessThan' => array('AWS:EpochTime' => $expires)
                )
            )
        )
    );

    if ($client_ip) {
        $policy['Statement'][0]['Condition']['IpAddress'] = array('AWS:SourceIp' => $client_ip . '/32');
    }

    $policy = json_encode($policy);
    $encoded_policy = url_safe_base64_encode($policy);
    $signature = rsa_sha1_sign($policy, $private_key_filename);
    $encoded_signature = url_safe_base64_encode($signature);

    return array(
        'CloudFront-Policy' => $encoded_policy,
        'CloudFront-Signature' => $encoded_signature,
        'CloudFront-Key-Pair-Id' => $key_pair_id
    );
}
```

Para obter mais informações, consulte [Definir cookies assinados usando uma política personalizada](private-content-setting-signed-cookie-custom-policy.md).

## Código completo
<a name="full-code-signed-cookies"></a>

O exemplo de código a seguir oferece uma demonstração completa de como criar cookies assinados do CloudFront com PHP. Você pode baixar o exemplo completo no arquivo [demo-php.zip](samples/demo-php.zip).

No exemplo a seguir, é possível modificar o elemento `$policy Condition` para permitir os intervalos de endereços IPv4 e IPv6. Por exemplo, consulte [Como usar endereços do IPv6 em políticas do IAM](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ipv6-access.html#ipv6-access-iam) no *Guia do usuário do Amazon Simple Storage Service*.

```
<?php

function rsa_sha1_sign($policy, $private_key_filename) {
    $signature = "";
    $fp = fopen($private_key_filename, "r");
    $priv_key = fread($fp, 8192);
    fclose($fp);
    $pkeyid = openssl_get_privatekey($priv_key);
    openssl_sign($policy, $signature, $pkeyid);
    openssl_free_key($pkeyid);
    return $signature;
}

function url_safe_base64_encode($value) {
    $encoded = base64_encode($value);
    return str_replace(
        array('+', '=', '/'),
        array('-', '_', '~'),
        $encoded);
}

function create_signed_cookies($resource, $private_key_filename, $key_pair_id, $expires, $client_ip = null) {
    $policy = array(
        'Statement' => array(
            array(
                'Resource' => $resource,
                'Condition' => array(
                    'DateLessThan' => array('AWS:EpochTime' => $expires)
                )
            )
        )
    );

    if ($client_ip) {
        $policy['Statement'][0]['Condition']['IpAddress'] = array('AWS:SourceIp' => $client_ip . '/32');
    }

    $policy = json_encode($policy);
    $encoded_policy = url_safe_base64_encode($policy);
    $signature = rsa_sha1_sign($policy, $private_key_filename);
    $encoded_signature = url_safe_base64_encode($signature);

    return array(
        'CloudFront-Policy' => $encoded_policy,
        'CloudFront-Signature' => $encoded_signature,
        'CloudFront-Key-Pair-Id' => $key_pair_id
    );
}



$private_key_filename = '/home/test/secure/example-priv-key.pem';
$key_pair_id = 'K2JCJMDEHXQW5F';
$base_url = 'https://d1234.cloudfront.net';

$expires = time() + 3600; // 1 hour from now

// Get the viewer real IP from the x-forward-for header as $_SERVER['REMOTE_ADDR'] will return viewer facing IP. An alternative option is to use CloudFront-Viewer-Address header. Note that this header is a trusted CloudFront immutable header. Example format: IP:PORT ("CloudFront-Viewer-Address": "1.2.3.4:12345")
$client_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];


// For HLS manifest and segments (using wildcard)
$hls_resource = $base_url . '/sign/*';
$signed_cookies = create_signed_cookies($hls_resource, $private_key_filename, $key_pair_id, $expires, $client_ip);

// Set the cookies
$cookie_domain = parse_url($base_url, PHP_URL_HOST);
foreach ($signed_cookies as $name => $value) {
    setcookie($name, $value, $expires, '/', $cookie_domain, true, true);
}

?>

<!DOCTYPE html>
<html>
<head>
    <title>CloudFront Signed HLS Stream with Cookies</title>
</head>
<body>
    <h1>Amazon CloudFront Signed HLS Stream with Cookies</h1>
    <h2>Expires at <?php echo gmdate('Y-m-d H:i:s T', $expires); ?> only viewable by IP <?php echo $client_ip; ?></h2>
    
    <div id='hls-video'>
        <video id="video" width="640" height="360" controls></video>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
    <script>
        var video = document.getElementById('video');
        var manifestUrl = '<?php echo $base_url; ?>/sign/manifest.m3u8';
        
        if (Hls.isSupported()) {
            var hls = new Hls();
            hls.loadSource(manifestUrl);
            hls.attachMedia(video);
        }
        else if (video.canPlayType('application/vnd.apple.mpegurl')) {
            video.src = manifestUrl;
        }
    </script>
</body>
</html>
```

Em vez de usar cookies assinados, você pode usar URLs assinados. Para obter mais informações, consulte [Criar uma assinatura de URL usando PHP](CreateURL_PHP.md).

# Comandos do Linux e OpenSSL para criptografia e codificação base64
<a name="private-content-linux-openssl"></a>

Você pode usar o comando de linha de comando do Linux a seguir e o OpenSSL para adicionar hash e assinar a declaração de política, codificar a assinatura em base64 e substituir caracteres inválidos dos parâmetros de query string do URL por caracteres válidos.

Para obter informações sobre o OpenSSL, acesse [https://www.openssl.org](https://www.openssl.org).

```
cat policy | tr -d "\n" | tr -d " \t\n\r" | openssl sha1 -sign private_key.pem | openssl base64 -A | tr -- '+=/' '-_~'
```

No comando anterior:
+ `cat` lê o arquivo `policy`.
+ `tr -d "\n" | tr -d " \t\n\r"` remove os espaços em branco e o caractere de nova linha que foram adicionados por `cat`.
+ O OpenSSL adiciona hash ao arquivo usando SHA-1 e o assina usando o arquivo de chave privada `private_key.pem`. A assinatura da chave privada pode ser RSA 2048 ou ECDSA 256.
+ O OpenSSL codifica em base64 a instrução de política assinada e com hash.
+ `tr` O substitui os caracteres inválidos dos parâmetros de string de consulta do URL pelos caracteres válidos.

Consulte mais exemplos de código que demonstram como criar uma assinatura em [Exemplos de código para criar uma assinatura para um signed URL](PrivateCFSignatureCodeAndExamples.md).

# Exemplos de código para criar uma assinatura para um signed URL
<a name="PrivateCFSignatureCodeAndExamples"></a>

Esta seção inclui exemplos de aplicativos para download que demonstram como criar assinaturas para signed URLs. Os exemplos estão disponíveis em Perl, PHP, C\$1 e Java. Você pode usar qualquer um dos exemplos para criar signed URLs. O script Perl é executado nas plataformas Linux e macOS. O exemplo PHP funciona em qualquer servidor com PHP. O exemplo C\$1 usa o .NET Framework.

Para obter um código de exemplo em JavaScript (Node.js), consulte [Criar URLs assinados do Amazon CloudFront em Node.js](https://aws.amazon.com/blogs/developer/creating-amazon-cloudfront-signed-urls-in-node-js/) no Blog do desenvolvedor da AWS.

Para ver um código de exemplo em Python, consulte [Generate a signed URL for Amazon CloudFront](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cloudfront.html#examples) na *Referência de API do AWS SDK for Python (Boto3)* e [este código de exemplo](https://github.com/boto/boto3/blob/develop/boto3/examples/cloudfront.rst) no repositório do Boto3 no GitHub.

**Topics**
+ [Criar uma assinatura de URL usando Perl](CreateURLPerl.md)
+ [Criar uma assinatura de URL usando PHP](CreateURL_PHP.md)
+ [Criar uma assinatura de URL usando C\$1 e o .NET Framework](CreateSignatureInCSharp.md)
+ [Criar uma assinatura de URL usando Java](CFPrivateDistJavaDevelopment.md)

# Criar uma assinatura de URL usando Perl
<a name="CreateURLPerl"></a>

Esta seção inclui um script Perl para plataformas Linux/Mac que você pode usar para criar a assinatura para conteúdo privado. Para criar a assinatura, execute o script com argumentos de linha de comando que especificam o URL do CloudFront, o caminho para a chave privada do assinante, o ID da chave e uma data de expiração para o URL. A ferramenta também pode decodificar signed URLs. 

**nota**  
A criação de uma assinatura de URL é apenas uma parte do processo de fornecimento de conteúdo privado usando um signed URL. Para obter mais informações sobre o todo o processo, consulte [Usar URLs assinados](private-content-signed-urls.md). 

**Topics**
+ [Fonte do script Perl para criar um signed URL](#CreateURLPerlScriptSource)

## Fonte do script Perl para criar um signed URL
<a name="CreateURLPerlScriptSource"></a>

O seguinte código-fonte Perl pode ser usado para criar uma URL assinada para CloudFront. Os comentários no código incluem informações sobre as opções da linha de comando e os recursos da ferramenta.

```
#!/usr/bin/perl -w

# Copyright 2008 Amazon Technologies, Inc.  Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. You may obtain a copy of the License at:
#
# https://aws.amazon.com/apache2.0
#
# This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and limitations under the License.

=head1 cfsign.pl

cfsign.pl - A tool to generate and verify Amazon CloudFront signed URLs

=head1 SYNOPSIS

This script uses an existing RSA key pair to sign and verify Amazon CloudFront signed URLs

View the script source for details as to which CPAN packages are required beforehand. 

For help, try:

cfsign.pl --help

URL signing examples:

cfsign.pl --action encode --url https://images.my-website.com/gallery1.zip --policy sample_policy.json --private-key privkey.pem --key-pair-id mykey

cfsign.pl --action encode --url https://images.my-website.com/gallery1.zip --expires 1257439868 --private-key privkey.pem --key-pair-id mykey

URL decode example:

cfsign.pl --action decode --url "http//mydist.cloudfront.net/?Signature=AGO-PgxkYo99MkJFHvjfGXjG1QDEXeaDb4Qtzmy85wqyJjK7eKojQWa4BCRcow__&Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovLypicmFkbS5qcGciLCJDb25kaXRpb24iOnsiSXBBZGRyZXNzIjp7IkFXUzpTb3VyY2VJcCI6IjEwLjUyLjE3LjkvMCJ9LCJEYXRlR3JlYXRlclRoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTI1MjUyMDgzMH19fV19Cg__&Key-Pair-Id=mykey"


To generate an RSA key pair, you can use openssl and the following commands:

# Generate a 2048 bit key pair
openssl genrsa -out private-key.pem 2048
openssl rsa -in private-key.pem -pubout -out public-key.pem


=head1 OPTIONS

=over 8

=item B<--help>

Print a help message and exits.

=item B<--action> [action]

The action to execute.  action can be one of:

  encode - Generate a signed URL (using a canned policy or a user policy)
  decode - Decode a signed URL

=item B<--url>

The URL to en/decode

=item B<--stream>

The stream to en/decode

=item B<--private-key>

The path to your private key.

=item B<--key-pair-id>

The key pair identifier.

=item B<--policy>

The CloudFront policy document.

=item B<--expires>

The Unix epoch time when the URL is to expire. If both this option and
the --policy option are specified, --policy will be used. Otherwise, this 
option alone will use a canned policy.

=back

=cut

use strict;
use warnings;

# you might need to use CPAN to get these modules.
# run perl -MCPAN -e "install <module>" to get them.
# The openssl command line will also need to be in your $PATH.
use File::Temp qw/tempfile/;
use File::Slurp;
use Getopt::Long;
use IPC::Open2;
use MIME::Base64 qw(encode_base64 decode_base64);
use Pod::Usage;
use URI;

my $CANNED_POLICY 
    = '{"Statement":[{"Resource":"<RESOURCE>","Condition":{"DateLessThan":{"AWS:EpochTime":<EXPIRES>}}}]}';

my $POLICY_PARAM      = "Policy";
my $EXPIRES_PARAM     = "Expires";
my $SIGNATURE_PARAM   = "Signature";
my $KEY_PAIR_ID_PARAM = "Key-Pair-Id";

my $verbose = 0;
my $policy_filename = "";
my $expires_epoch = 0;
my $action = "";
my $help = 0;
my $key_pair_id = "";
my $url = "";
my $stream = "";
my $private_key_filename = "";

my $result = GetOptions("action=s"      => \$action,
                        "policy=s"      => \$policy_filename,
                        "expires=i"     => \$expires_epoch,
                        "private-key=s" => \$private_key_filename,
                        "key-pair-id=s" => \$key_pair_id,
                        "verbose"       => \$verbose,
                        "help"          => \$help,
                        "url=s"         => \$url,
                        "stream=s"      => \$stream,
                    );

if ($help or !$result) {
    pod2usage(1);
    exit;
}

if ($url eq "" and $stream eq "") {
    print STDERR "Must include a stream or a URL to encode or decode with the --stream or --url option\n";
    exit;
}

if ($url ne "" and $stream ne "") {
    print STDERR "Only one of --url and --stream may be specified\n";
    exit;
}

if ($url ne "" and !is_url_valid($url)) {
    exit;
}

if ($stream ne "") {
    exit unless is_stream_valid($stream);

    # The signing mechanism is identical, so from here on just pretend we're
    # dealing with a URL
    $url = $stream;
} 

if ($action eq "encode") {
    # The encode action will generate a private content URL given a base URL, 
    # a policy file (or an expires timestamp) and a key pair id parameter
    my $private_key;
    my $public_key;
    my $public_key_file;
    
    my $policy;
    if ($policy_filename eq "") {
        if ($expires_epoch == 0) {
            print STDERR "Must include policy filename with --policy argument or an expires" . 
                          "time using --expires\n";            
        }
        
        $policy = $CANNED_POLICY;
        $policy =~ s/<EXPIRES>/$expires_epoch/g;
        $policy =~ s/<RESOURCE>/$url/g;
    } else {
        if (! -e $policy_filename) {
            print STDERR "Policy file $policy_filename does not exist\n";
            exit;
        }
        $expires_epoch = 0; # ignore if set
        $policy = read_file($policy_filename);
    }

    if ($private_key_filename eq "") {
        print STDERR "You must specific the path to your private key file with --private-key\n";
        exit;
    }

    if (! -e $private_key_filename) {
        print STDERR "Private key file $private_key_filename does not exist\n";
        exit;
    }

    if ($key_pair_id eq "") {
        print STDERR "You must specify a key pair id with --key-pair-id\n";
        exit;
    }

    my $encoded_policy = url_safe_base64_encode($policy);
    my $signature = rsa_sha1_sign($policy, $private_key_filename);
    my $encoded_signature = url_safe_base64_encode($signature);

    my $generated_url = create_url($url, $encoded_policy, $encoded_signature, $key_pair_id, $expires_epoch);


    if ($stream ne "") {
        print "Encoded stream (for use within a swf):\n" . $generated_url . "\n";
        print "Encoded and escaped stream (for use on a webpage):\n" .  escape_url_for_webpage($generated_url) . "\n"; 
    } else {
        print "Encoded URL:\n" . $generated_url . "\n";
    }
} elsif ($action eq "decode") {
    my $decoded = decode_url($url);
    if (!$decoded) {
        print STDERR "Improperly formed URL\n";
        exit;
    }

    print_decoded_url($decoded);
} else {
    # No action specified, print help.  But only if this is run as a program (caller will be empty)
    pod2usage(1) unless caller();
}

# Decode a private content URL into its component parts
sub decode_url {
    my $url = shift;

    if ($url =~ /(.*)\?(.*)/) {
        my $base_url = $1;
        my $params = $2;

        my @unparsed_params = split(/&/, $params);
        my %params = ();
        foreach my $param (@unparsed_params) {
            my ($key, $val) = split(/=/, $param);
            $params{$key} = $val;
        }

        my $encoded_signature = "";
        if (exists $params{$SIGNATURE_PARAM}) {
            $encoded_signature = $params{"Signature"};
        } else {
            print STDERR "Missing Signature URL parameter\n";
            return 0;
        }

        my $encoded_policy = "";
        if (exists $params{$POLICY_PARAM}) {
            $encoded_policy = $params{$POLICY_PARAM};
        } else {
            if (!exists $params{$EXPIRES_PARAM}) {
                print STDERR "Either the Policy or Expires URL parameter needs to be specified\n";
                return 0;    
            }
            
            my $expires = $params{$EXPIRES_PARAM};
            
            my $policy = $CANNED_POLICY;
            $policy =~ s/<EXPIRES>/$expires/g;
            
            my $url_without_cf_params = $url;
            $url_without_cf_params =~ s/$SIGNATURE_PARAM=[^&]*&?//g;
            $url_without_cf_params =~ s/$POLICY_PARAM=[^&]*&?//g;
            $url_without_cf_params =~ s/$EXPIRES_PARAM=[^&]*&?//g;
            $url_without_cf_params =~ s/$KEY_PAIR_ID_PARAM=[^&]*&?//g;
            
            if ($url_without_cf_params =~ /(.*)\?$/) {
                $url_without_cf_params = $1;
            }
            
            $policy =~ s/<RESOURCE>/$url_without_cf_params/g;
            
            $encoded_policy = url_safe_base64_encode($policy);
        }

        my $key = "";
        if (exists $params{$KEY_PAIR_ID_PARAM}) {
            $key = $params{$KEY_PAIR_ID_PARAM};
        } else {
            print STDERR "Missing $KEY_PAIR_ID_PARAM parameter\n";
            return 0;
        }

        my $policy = url_safe_base64_decode($encoded_policy);

        my %ret = ();
        $ret{"base_url"} = $base_url;
        $ret{"policy"} = $policy;
        $ret{"key"} = $key;

        return \%ret;
    } else {
        return 0;
    }
}

# Print a decoded URL out
sub print_decoded_url {
    my $decoded = shift;

    print "Base URL: \n" . $decoded->{"base_url"} . "\n";
    print "Policy: \n" . $decoded->{"policy"} . "\n";
    print "Key: \n" . $decoded->{"key"} . "\n";
}

# Encode a string with base 64 encoding and replace some invalid URL characters
sub url_safe_base64_encode {
    my ($value) = @_;

    my $result = encode_base64($value);
    $result =~ tr|+=/|-_~|;

    return $result;
}

# Decode a string with base 64 encoding.  URL-decode the string first
# followed by reversing any special character ("+=/") translation.
sub url_safe_base64_decode {
    my ($value) = @_;

    $value =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
    $value =~ tr|-_~|+=/|;

    my $result = decode_base64($value);

    return $result;
}

# Create a private content URL
sub create_url {
    my ($path, $policy, $signature, $key_pair_id, $expires) = @_;
    
    my $result;
    my $separator = $path =~ /\?/ ? '&' : '?';
    if ($expires) {
        $result = "$path$separator$EXPIRES_PARAM=$expires&$SIGNATURE_PARAM=$signature&$KEY_PAIR_ID_PARAM=$key_pair_id";
    } else {
        $result = "$path$separator$POLICY_PARAM=$policy&$SIGNATURE_PARAM=$signature&$KEY_PAIR_ID_PARAM=$key_pair_id";
    }
    $result =~ s/\n//g;

    return $result;
}

# Sign a document with given private key file.
# The first argument is the document to sign
# The second argument is the name of the private key file
sub rsa_sha1_sign {
    my ($to_sign, $pvkFile) = @_;
    print "openssl sha1 -sign $pvkFile $to_sign\n";

    return write_to_program($pvkFile, $to_sign);
}

# Helper function to write data to a program
sub write_to_program {
my ($keyfile, $data) = @_;
unlink "temp_policy.dat" if (-e "temp_policy.dat");
unlink "temp_sign.dat" if (-e "temp_sign.dat");

write_file("temp_policy.dat", $data);

system("openssl dgst -sha1 -sign \"$keyfile\" -out temp_sign.dat temp_policy.dat");

my $output = read_file("temp_sign.dat");

    return $output;
}

# Read a file into a string and return the string
sub read_file {
    my ($file) = @_;

    open(INFILE, "<$file") or die("Failed to open $file: $!");
    my $str = join('', <INFILE>);
    close INFILE;

    return $str;
}

sub is_url_valid {
    my ($url) = @_;

    # HTTP distributions start with http[s]:// and are the correct thing to sign
    if ($url =~ /^https?:\/\//) {
        return 1;
    } else {
        print STDERR "CloudFront requires absolute URLs for HTTP distributions\n";
        return 0;
    }
}

sub is_stream_valid {
    my ($stream) = @_;

    if ($stream =~ /^rtmp:\/\// or $stream =~ /^\/?cfx\/st/) {
        print STDERR "Streaming distributions require that only the stream name is signed.\n";
        print STDERR "The stream name is everything after, but not including, cfx/st/\n";
        return 0;
    } else {
        return 1;
    }
}

# flash requires that the query parameters in the stream name are url
# encoded when passed in through javascript, etc.  This sub handles the minimal
# required url encoding.
sub escape_url_for_webpage {
    my ($url) = @_;

    $url =~ s/\?/%3F/g;
    $url =~ s/=/%3D/g;
    $url =~ s/&/%26/g;

    return $url;
}

1;
```

# Criar uma assinatura de URL usando PHP
<a name="CreateURL_PHP"></a>

Qualquer servidor da web que execute PHP pode usar esse exemplo de código PHP para criar declarações de política e assinaturas para distribuições privadas do CloudFront. O exemplo completo cria uma página da web ativa com links de signed URL que reproduzem um streaming de vídeo usando streaming do CloudFront. Você pode baixar o exemplo completo no arquivo [demo-php.zip](samples/demo-php.zip).

**Observações**  
A criação de uma assinatura de URL é apenas uma parte do processo de fornecimento de conteúdo privado usando um signed URL. Para obter mais informações sobre o todo o processo, consulte [Usar URLs assinados](private-content-signed-urls.md). 
Você também pode criar URLs assinados usando a classe `UrlSigner` no AWS SDK para PHP. Para obter mais informações, consulte [Classe UrlSigner](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.CloudFront.UrlSigner.html) na *Referência de API do AWS SDK para PHP*.

**Topics**
+ [Criar a assinatura RSA SHA-1](#sample-rsa-sign)
+ [Criar uma política predefinida](#sample-canned-policy)
+ [Criar uma política personalizada](#sample-custom-policy)
+ [Exemplo de código completo](#full-example)

As seções a seguir dividem o exemplo de código em partes individuais. Você pode encontrar o [Exemplo de código completo](#full-example) abaixo.

## Criar a assinatura RSA SHA-1
<a name="sample-rsa-sign"></a>

Este exemplo faz o seguinte:
+ A função `rsa_sha1_sign` cria o hash e assina a declaração de política. Os argumentos necessários são uma declaração de política e a chave privada que corresponde a uma chave pública que está em um grupo de chaves confiável para sua distribuição. 
+ Em seguida, a função `url_safe_base64_encode` cria uma versão da assinatura segura para URL.

```
function rsa_sha1_sign($policy, $private_key_filename) {
    $signature = "";

    // load the private key
    $fp = fopen($private_key_filename, "r");
    $priv_key = fread($fp, 8192);
    fclose($fp);
    $pkeyid = openssl_get_privatekey($priv_key);

    // compute signature
    openssl_sign($policy, $signature, $pkeyid);

    // free the key from memory
    openssl_free_key($pkeyid);

    return $signature;
}

function url_safe_base64_encode($value) {
    $encoded = base64_encode($value);
    // replace unsafe characters +, = and / with 
    // the safe characters -, _ and ~
    return str_replace(
        array('+', '=', '/'),
        array('-', '_', '~'),
        $encoded);
}
```

O trecho de código a seguir usa as funções `get_canned_policy_stream_name()` e `get_custom_policy_stream_name()` para criar uma política predefinida e uma personalizada. O CloudFront usa as políticas para criar o URL para transmitir o vídeo, bem como especificar o tempo de expiração. 

Em seguida, você pode usar uma política predefinida ou uma política personalizada para determinar como gerenciar o acesso ao seu conteúdo. Para ter mais informações sobre qual escolher, consulte a seção [Decidir usar políticas predefinidas ou personalizadas para URLs assinados](private-content-signed-urls.md#private-content-choosing-canned-custom-policy).

## Criar uma política predefinida
<a name="sample-canned-policy"></a>

O código de exemplo a seguir cria uma declaração de política *padrão* para a assinatura. 

**nota**  
A variável `$expires` é um carimbo de data/hora que deve ser um número inteiro, não uma string.

```
function get_canned_policy_stream_name($video_path, $private_key_filename, $key_pair_id, $expires) {
    // this policy is well known by CloudFront, but you still need to sign it, since it contains your parameters
    $canned_policy = '{"Statement":[{"Resource":"' . $video_path . '","Condition":{"DateLessThan":{"AWS:EpochTime":'. $expires . '}}}]}';
    // the policy contains characters that cannot be part of a URL, so we base64 encode it
    $encoded_policy = url_safe_base64_encode($canned_policy);
    // sign the original policy, not the encoded version
    $signature = rsa_sha1_sign($canned_policy, $private_key_filename);
    // make the signature safe to be included in a URL
    $encoded_signature = url_safe_base64_encode($signature);

    // combine the above into a stream name
    $stream_name = create_stream_name($video_path, null, $encoded_signature, $key_pair_id, $expires);
    // URL-encode the query string characters
    return $stream_name;
}
```

Para obter mais informações sobre políticas padrão, consulte [Criar um URL assinado usando uma política predefinida](private-content-creating-signed-url-canned-policy.md).

## Criar uma política personalizada
<a name="sample-custom-policy"></a>

O código de exemplo a seguir cria uma declaração de política *personalizada* para a assinatura. 

```
function get_custom_policy_stream_name($video_path, $private_key_filename, $key_pair_id, $policy) {
    // the policy contains characters that cannot be part of a URL, so we base64 encode it
    $encoded_policy = url_safe_base64_encode($policy);
    // sign the original policy, not the encoded version
    $signature = rsa_sha1_sign($policy, $private_key_filename);
    // make the signature safe to be included in a URL
    $encoded_signature = url_safe_base64_encode($signature);

    // combine the above into a stream name
    $stream_name = create_stream_name($video_path, $encoded_policy, $encoded_signature, $key_pair_id, null);
    // URL-encode the query string characters
    return $stream_name;
}
```

Para obter mais informações sobre políticas personalizadas, consulte [Criar um URL assinado usando uma política personalizada](private-content-creating-signed-url-custom-policy.md).

## Exemplo de código completo
<a name="full-example"></a>

O exemplo de código a seguir fornece uma demonstração completa de como criar signed URLs do CloudFront com PHP. Você pode baixar o exemplo completo no arquivo [demo-php.zip](samples/demo-php.zip).

No exemplo a seguir, é possível modificar o elemento `$policy` `Condition` para permitir os intervalos de endereços do IPv4 e do IPv6. Por exemplo, consulte [Como usar endereços do IPv6 em políticas do IAM](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ipv6-access.html#ipv6-access-iam) no *Guia do usuário do Amazon Simple Storage Service*.

```
<?php

function rsa_sha1_sign($policy, $private_key_filename) {
    $signature = "";

    // load the private key
    $fp = fopen($private_key_filename, "r");
    $priv_key = fread($fp, 8192);
    fclose($fp);
    $pkeyid = openssl_get_privatekey($priv_key);

    // compute signature
    openssl_sign($policy, $signature, $pkeyid);

    // free the key from memory
    openssl_free_key($pkeyid);

    return $signature;
}

function url_safe_base64_encode($value) {
    $encoded = base64_encode($value);
    // replace unsafe characters +, = and / with the safe characters -, _ and ~
    return str_replace(
        array('+', '=', '/'),
        array('-', '_', '~'),
        $encoded);
}

function create_stream_name($stream, $policy, $signature, $key_pair_id, $expires) {
    $result = $stream;
    // if the stream already contains query parameters, attach the new query parameters to the end
    // otherwise, add the query parameters
    $separator = strpos($stream, '?') == FALSE ? '?' : '&';
    // the presence of an expires time means we're using a canned policy
    if($expires) {
        $result .= $separator . "Expires=" . $expires . "&Signature=" . $signature . "&Key-Pair-Id=" . $key_pair_id;
    }
    // not using a canned policy, include the policy itself in the stream name
    else {
        $result .= $separator . "Policy=" . $policy . "&Signature=" . $signature . "&Key-Pair-Id=" . $key_pair_id;
    }

    // new lines would break us, so remove them
    return str_replace('\n', '', $result);
}


function get_canned_policy_stream_name($video_path, $private_key_filename, $key_pair_id, $expires) {
    // this policy is well known by CloudFront, but you still need to sign it, since it contains your parameters
    $canned_policy = '{"Statement":[{"Resource":"' . $video_path . '","Condition":{"DateLessThan":{"AWS:EpochTime":'. $expires . '}}}]}';
    // the policy contains characters that cannot be part of a URL, so we base64 encode it
    $encoded_policy = url_safe_base64_encode($canned_policy);
    // sign the original policy, not the encoded version
    $signature = rsa_sha1_sign($canned_policy, $private_key_filename);
    // make the signature safe to be included in a URL
    $encoded_signature = url_safe_base64_encode($signature);

    // combine the above into a stream name
    $stream_name = create_stream_name($video_path, null, $encoded_signature, $key_pair_id, $expires);
    // URL-encode the query string characters
    return $stream_name;
}

function get_custom_policy_stream_name($video_path, $private_key_filename, $key_pair_id, $policy) {
    // the policy contains characters that cannot be part of a URL, so we base64 encode it
    $encoded_policy = url_safe_base64_encode($policy);
    // sign the original policy, not the encoded version
    $signature = rsa_sha1_sign($policy, $private_key_filename);
    // make the signature safe to be included in a URL
    $encoded_signature = url_safe_base64_encode($signature);

    // combine the above into a stream name
    $stream_name = create_stream_name($video_path, $encoded_policy, $encoded_signature, $key_pair_id, null);
    // URL-encode the query string characters
    return $stream_name;
}


// Path to your private key.  Be very careful that this file is not accessible
// from the web!

$private_key_filename = '/home/test/secure/example-priv-key.pem';
$key_pair_id = 'K2JCJMDEHXQW5F';

// Make sure you have "Restrict viewer access" enabled on this path behaviour and using the above Trusted key groups (recommended).
$video_path = 'https://example.com/secure/example.mp4';

$expires = time() + 300; // 5 min from now
$canned_policy_stream_name = get_canned_policy_stream_name($video_path, $private_key_filename, $key_pair_id, $expires);

// Get the viewer real IP from the x-forward-for header as $_SERVER['REMOTE_ADDR'] will return viewer facing IP. An alternative option is to use CloudFront-Viewer-Address header. Note that this header is a trusted CloudFront immutable header. Example format: IP:PORT ("CloudFront-Viewer-Address": "1.2.3.4:12345")
$client_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
$policy =
'{'.
    '"Statement":['.
        '{'.
            '"Resource":"'. $video_path . '",'.
            '"Condition":{'.
                '"IpAddress":{"AWS:SourceIp":"' . $client_ip . '/32"},'.
                '"DateLessThan":{"AWS:EpochTime":' . $expires . '}'.
            '}'.
        '}'.
    ']' .
    '}';
$custom_policy_stream_name = get_custom_policy_stream_name($video_path, $private_key_filename, $key_pair_id, $policy);

?>

<html>

<head>
    <title>CloudFront</title>
</head>

<body>
    <h1>Amazon CloudFront</h1>
    <h2>Canned Policy</h2>
    <h3>Expires at <?php echo gmdate('Y-m-d H:i:s T', $expires); ?></h3>
    <br />

    <div id='canned'>The canned policy video will be here: <br>
    
        <video width="640" height="360" autoplay muted controls>
        <source src="<?php echo $canned_policy_stream_name; ?>" type="video/mp4">
        Your browser does not support the video tag.
        </video>
    </div>

    <h2>Custom Policy</h2>
    <h3>Expires at <?php echo gmdate('Y-m-d H:i:s T', $expires); ?> only viewable by IP <?php echo $client_ip; ?></h3>
    <div id='custom'>The custom policy video will be here: <br>

         <video width="640" height="360" autoplay muted controls>
         <source src="<?php echo $custom_policy_stream_name; ?>" type="video/mp4">
         Your browser does not support the video tag.
        </video>
    </div> 

</body>

</html>
```

Para obter exemplos adicionais de URL assinado, consulte estes tópicos:
+ [Criar uma assinatura de URL usando Perl](CreateURLPerl.md)
+ [Criar uma assinatura de URL usando C\$1 e o .NET Framework](CreateSignatureInCSharp.md)
+ [Criar uma assinatura de URL usando Java](CFPrivateDistJavaDevelopment.md)

Em vez de usar URLs assinados para criar a assinatura, você pode usar cookies assinados. Para obter mais informações, consulte [Criar cookies assinados usando PHP](signed-cookies-PHP.md).

# Criar uma assinatura de URL usando C\$1 e o .NET Framework
<a name="CreateSignatureInCSharp"></a>

Os exemplos de C\$1 desta seção implementam um exemplo de aplicação que demonstra como criar assinaturas para distribuições privadas do CloudFront usando declarações de política padrão e personalizada. Alguns dos exemplos são as funções de utilitário com base no [AWS SDK para .NET](https://aws.amazon.com/sdkfornet) que podem ser úteis em aplicações .NET.

Você também pode criar URLs assinados e cookies com o uso do SDK para .NET. Na *Referência de API do SDK para .NET*, consulte os seguintes tópicos:
+ **URLs assinados**: [AmazonCloudFrontUrlSigner](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/CloudFront/TCloudFrontUrlSigner.html) 
+ **Cookies assinados**: [AmazonCloudFrontCookieSigner](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/CloudFront/TCloudFrontCookieSigner.html) 

Para fazer download do código, acesse [Código de assinatura em C\$1](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/samples/AWS_PrivateCF_Distributions.zip).

**Observações**  
As classes `AmazonCloudFrontUrlSigner` e `AmazonCloudFrontCookieSigner` foram movidas para um pacote separado. Para ter mais informações sobre como usá-las, consulte [CookieSigner e UrlSigner](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html#net-dg-v4-CookieSigner-UrlSigner) no *Guia do desenvolvedor do AWS SDK para .NET (V4)*. 
A criação de uma assinatura de URL é apenas uma parte do processo de fornecimento de conteúdo privado usando um signed URL. Para obter mais informações, consulte [Usar URLs assinados](private-content-signed-urls.md). Para ter mais informações sobre como usar cookies assinados, consulte [Usar cookies assinados](private-content-signed-cookies.md).

## Usar uma chave RSA no .NET Framework
<a name="rsa-key-sdk-net"></a>

Para usar uma chave RSA no .NET Framework, converta o arquivo .pem da AWS fornecido no formato XML usado pelo .NET Framework.

Após a conversão, o arquivo de chave privada do RSA ficará no seguinte formato:

**Example : chave privada do RSA no formato XML do .NET Framework**  <a name="RSAPrivateKeyXML.NETFrameworkFormat"></a>

```
<RSAKeyValue>
  <Modulus>
    wO5IvYCP5UcoCKDo1dcspoMehWBZcyfs9QEzGi6Oe5y+ewGr1oW+vB2GPB
    ANBiVPcUHTFWhwaIBd3oglmF0lGQljP/jOfmXHUK2kUUnLnJp+oOBL2NiuFtqcW6h/L5lIpD8Yq+NRHg
    Ty4zDsyr2880MvXv88yEFURCkqEXAMPLE=
  </Modulus>
  <Exponent>AQAB</Exponent>
  <P>
    5bmKDaTz
    npENGVqz4Cea8XPH+sxt+2VaAwYnsarVUoSBeVt8WLloVuZGG9IZYmH5KteXEu7fZveYd9UEXAMPLE==
  </P>
  <Q>
    1v9l/WN1a1N3rOK4VGoCokx7kR2SyTMSbZgF9IWJNOugR/WZw7HTnjipO3c9dy1Ms9pUKwUF4
    6d7049EXAMPLE==
  </Q>
  <DP>
    RgrSKuLWXMyBH+/l1Dx/I4tXuAJIrlPyo+VmiOc7b5NzHptkSHEPfR9s1
    OK0VqjknclqCJ3Ig86OMEtEXAMPLE==
  </DP>
  <DQ>
    pjPjvSFw+RoaTu0pgCA/jwW/FGyfN6iim1RFbkT4
    z49DZb2IM885f3vf35eLTaEYRYUHQgZtChNEV0TEXAMPLE==
  </DQ>
  <InverseQ>
    nkvOJTg5QtGNgWb9i
    cVtzrL/1pFEOHbJXwEJdU99N+7sMK+1066DL/HSBUCD63qD4USpnf0myc24in0EXAMPLE==</InverseQ>
  <D>
      Bc7mp7XYHynuPZxChjWNJZIq+A73gm0ASDv6At7F8Vi9r0xUlQe/v0AQS3ycN8QlyR4XMbzMLYk
      3yjxFDXo4ZKQtOGzLGteCU2srANiLv26/imXA8FVidZftTAtLviWQZBVPTeYIA69ATUYPEq0a5u5wjGy
      UOij9OWyuEXAMPLE=
   </D>
</RSAKeyValue>
```

## Método de assinatura de política padrão em C\$1
<a name="canned-policy-signed-url-net"></a>

O seguinte código C\$1 cria um URL assinado que usa uma política padrão executando as seguintes etapas:
+ Cria uma declaração de política.
+ Adiciona hash à declaração de política usando SHA1 e assina o resultado usando RSA e a chave privada com a chave pública correspondente que está em um grupo de chaves confiável.
+ Codifica em base64 a declaração de política assinada e com hash e substitui os caracteres especiais para tornar a string segura para ser usada como parâmetro de solicitação de URL.
+ Concatena os valores.

Para obter a implementação completa, consulte o exemplo em [Código de assinatura em C\$1](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/samples/AWS_PrivateCF_Distributions.zip). 

**nota**  
O `keyId` é exibido quando você faz upload de uma chave pública no CloudFront. Para ter mais informações, consulte ![\[6\]](http://docs.aws.amazon.com/pt_br/AmazonCloudFront/latest/DeveloperGuide/images/callouts/6.png)[ &Key-Pair-Id](private-content-creating-signed-url-canned-policy.md).

**Example : método de assinatura de política predefinida em C\$1**  <a name="ExampleCannedPolicySigningMethod-CSharp"></a>

```
public static string ToUrlSafeBase64String(byte[] bytes)
{
    return System.Convert.ToBase64String(bytes)
        .Replace('+', '-')
        .Replace('=', '_')
        .Replace('/', '~');
}

public static string CreateCannedPrivateURL(string urlString, 
    string durationUnits, string durationNumber, string pathToPolicyStmnt, 
    string pathToPrivateKey, string keyId)
{
    // args[] 0-thisMethod, 1-resourceUrl, 2-seconds-minutes-hours-days 
    // to expiration, 3-numberOfPreviousUnits, 4-pathToPolicyStmnt, 
    // 5-pathToPrivateKey, 6-keyId

    TimeSpan timeSpanInterval = GetDuration(durationUnits, durationNumber);

    // Create the policy statement.
    string strPolicy = CreatePolicyStatement(pathToPolicyStmnt,
        urlString, 
        DateTime.Now, 
        DateTime.Now.Add(timeSpanInterval), 
        "0.0.0.0/0");
    if ("Error!" == strPolicy) return "Invalid time frame." + 
        "Start time cannot be greater than end time.";

    // Copy the expiration time defined by policy statement.
    string strExpiration = CopyExpirationTimeFromPolicy(strPolicy);

    // Read the policy into a byte buffer.
    byte[] bufferPolicy = Encoding.ASCII.GetBytes(strPolicy);

    // Initialize the SHA1CryptoServiceProvider object and hash the policy data.
    using (SHA1CryptoServiceProvider 
        cryptoSHA1 = new SHA1CryptoServiceProvider())
    {
        bufferPolicy = cryptoSHA1.ComputeHash(bufferPolicy);

        // Initialize the RSACryptoServiceProvider object.
        RSACryptoServiceProvider providerRSA = new RSACryptoServiceProvider();
        XmlDocument xmlPrivateKey = new XmlDocument();

        // Load your private key, which you created by converting your 
        // .pem file to the XML format that the .NET framework uses.  
        // Several tools are available. 
        xmlPrivateKey.Load(pathToPrivateKey);

        // Format the RSACryptoServiceProvider providerRSA and 
        // create the signature.
        providerRSA.FromXmlString(xmlPrivateKey.InnerXml);
        RSAPKCS1SignatureFormatter rsaFormatter = 
            new RSAPKCS1SignatureFormatter(providerRSA);
        rsaFormatter.SetHashAlgorithm("SHA1");
        byte[] signedPolicyHash = rsaFormatter.CreateSignature(bufferPolicy);

        // Convert the signed policy to URL-safe base64 encoding and 
        // replace unsafe characters + = / with the safe characters - _ ~
        string strSignedPolicy = ToUrlSafeBase64String(signedPolicyHash);

        // Concatenate the URL, the timestamp, the signature, 
        // and the key pair ID to form the signed URL.
        return urlString + 
            "?Expires=" + 
            strExpiration + 
            "&Signature=" + 
            strSignedPolicy + 
            "&Key-Pair-Id=" + 
            keyId;
    }
}
```

## Método de assinatura de política personalizada em C\$1
<a name="custom-policy-signed-url-net"></a>

O seguinte código C\$1 cria um URL assinado que usa uma política personalizada executando as seguintes etapas:

1. Cria uma declaração de política.

1. Codifica a declaração de política em base64 e substitui os caracteres especiais para tornar a string segura para ser usada como parâmetro de solicitação de URL.

1. Adiciona hash a declaração de política usando SHA1 e criptografa o resultado usando RSA e a chave privada com a chave pública correspondente que está em um grupo de chaves confiável.

1. Codifica em base64 a declaração de política com hash e substitui os caracteres especiais para tornar a string segura para ser usada como parâmetro de solicitação de URL.

1. Concatena os valores.

Para obter a implementação completa, consulte o exemplo em [Código de assinatura em C\$1](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/samples/AWS_PrivateCF_Distributions.zip). 

**nota**  
O `keyId` é exibido quando você faz upload de uma chave pública no CloudFront. Para ter mais informações, consulte ![\[6\]](http://docs.aws.amazon.com/pt_br/AmazonCloudFront/latest/DeveloperGuide/images/callouts/6.png)[ &Key-Pair-Id](private-content-creating-signed-url-canned-policy.md).

**Example : método de assinatura de política personalizada em C\$1**  <a name="ExampleCustomPolicySigningMethod-CSharp"></a>

```
public static string ToUrlSafeBase64String(byte[] bytes)
{
    return System.Convert.ToBase64String(bytes)
        .Replace('+', '-')
        .Replace('=', '_')
        .Replace('/', '~');
}

public static string CreateCustomPrivateURL(string urlString, 
    string durationUnits, string durationNumber, string startIntervalFromNow, 
    string ipaddress, string pathToPolicyStmnt, string pathToPrivateKey, 
    string keyId)
{
    // args[] 0-thisMethod, 1-resourceUrl, 2-seconds-minutes-hours-days 
    // to expiration, 3-numberOfPreviousUnits, 4-starttimeFromNow, 
    // 5-ip_address, 6-pathToPolicyStmt, 7-pathToPrivateKey, 8-keyId

    TimeSpan timeSpanInterval = GetDuration(durationUnits, durationNumber);
    TimeSpan timeSpanToStart = GetDurationByUnits(durationUnits, 
        startIntervalFromNow);
    if (null == timeSpanToStart) 
        return "Invalid duration units." + 
            "Valid options: seconds, minutes, hours, or days";
            
    string strPolicy = CreatePolicyStatement(
        pathToPolicyStmnt, urlString, DateTime.Now.Add(timeSpanToStart), 
        DateTime.Now.Add(timeSpanInterval), ipaddress);

    // Read the policy into a byte buffer.
    byte[] bufferPolicy = Encoding.ASCII.GetBytes(strPolicy);

    // Convert the policy statement to URL-safe base64 encoding and 
    // replace unsafe characters + = / with the safe characters - _ ~

    string urlSafePolicy = ToUrlSafeBase64String(bufferPolicy);

    // Initialize the SHA1CryptoServiceProvider object and hash the policy data.
    byte[] bufferPolicyHash;
    using (SHA1CryptoServiceProvider cryptoSHA1 = 
        new SHA1CryptoServiceProvider())
    {
        bufferPolicyHash = cryptoSHA1.ComputeHash(bufferPolicy);

        // Initialize the RSACryptoServiceProvider object.
        RSACryptoServiceProvider providerRSA = new RSACryptoServiceProvider();
        XmlDocument xmlPrivateKey = new XmlDocument();

        // Load your private key, which you created by converting your 
        // .pem file to the XML format that the .NET framework uses.  
        // Several tools are available. 
        xmlPrivateKey.Load(pathToPrivateKey);

        // Format the RSACryptoServiceProvider providerRSA 
        // and create the signature.
        providerRSA.FromXmlString(xmlPrivateKey.InnerXml);
        RSAPKCS1SignatureFormatter RSAFormatter = 
            new RSAPKCS1SignatureFormatter(providerRSA);
        RSAFormatter.SetHashAlgorithm("SHA1");
        byte[] signedHash = RSAFormatter.CreateSignature(bufferPolicyHash);

        // Convert the signed policy to URL-safe base64 encoding and 
        // replace unsafe characters + = / with the safe characters - _ ~
        string strSignedPolicy = ToUrlSafeBase64String(signedHash);

        return urlString + 
            "?Policy=" + 
            urlSafePolicy + 
            "&Signature=" + 
            strSignedPolicy + 
            "&Key-Pair-Id=" + 
            keyId;
    }
}
```

## Métodos utilitários para geração de assinaturas
<a name="utility-methods-signed-url"></a>

Os métodos a seguir obtêm a declaração de política de um arquivo e analisam os intervalos de tempo para a geração de assinatura.

**Example : métodos utilitários para geração de assinaturas**  <a name="UtilityMethodsForSignatureGeneration"></a>

```
public static string CreatePolicyStatement(string policyStmnt, 
   string resourceUrl, 
   DateTime startTime, 
   DateTime endTime, 
   string ipAddress)
   
{
   // Create the policy statement.
   FileStream streamPolicy = new FileStream(policyStmnt, FileMode.Open, FileAccess.Read);
   using (StreamReader reader = new StreamReader(streamPolicy))
   {
      string strPolicy = reader.ReadToEnd();

      TimeSpan startTimeSpanFromNow = (startTime - DateTime.Now);
      TimeSpan endTimeSpanFromNow = (endTime - DateTime.Now);
      TimeSpan intervalStart = 
         (DateTime.UtcNow.Add(startTimeSpanFromNow)) - 
         new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
      TimeSpan intervalEnd = 
         (DateTime.UtcNow.Add(endTimeSpanFromNow)) - 
         new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

      int startTimestamp = (int)intervalStart.TotalSeconds; // START_TIME
      int endTimestamp = (int)intervalEnd.TotalSeconds;  // END_TIME

      if (startTimestamp > endTimestamp)
         return "Error!";

      // Replace variables in the policy statement.
      strPolicy = strPolicy.Replace("RESOURCE", resourceUrl);
      strPolicy = strPolicy.Replace("START_TIME", startTimestamp.ToString());
      strPolicy = strPolicy.Replace("END_TIME", endTimestamp.ToString());
      strPolicy = strPolicy.Replace("IP_ADDRESS", ipAddress);
      strPolicy = strPolicy.Replace("EXPIRES", endTimestamp.ToString());
      return strPolicy;
   }   
}

public static TimeSpan GetDuration(string units, string numUnits)
{
   TimeSpan timeSpanInterval = new TimeSpan();
   switch (units)
   {
      case "seconds":
         timeSpanInterval = new TimeSpan(0, 0, 0, int.Parse(numUnits));
         break;
      case "minutes":
         timeSpanInterval = new TimeSpan(0, 0, int.Parse(numUnits), 0);
         break;
      case "hours":
         timeSpanInterval = new TimeSpan(0, int.Parse(numUnits), 0 ,0);
         break;
      case "days":
         timeSpanInterval = new TimeSpan(int.Parse(numUnits),0 ,0 ,0);
         break;
      default:
         Console.WriteLine("Invalid time units;" + 
            "use seconds, minutes, hours, or days");
         break;
   }
   return timeSpanInterval;
}

private static TimeSpan GetDurationByUnits(string durationUnits, 
   string startIntervalFromNow)
{
   switch (durationUnits)
   {
      case "seconds":
         return new TimeSpan(0, 0, int.Parse(startIntervalFromNow));
      case "minutes":
         return new TimeSpan(0, int.Parse(startIntervalFromNow), 0);
      case "hours":
         return new TimeSpan(int.Parse(startIntervalFromNow), 0, 0);
      case "days":
         return new TimeSpan(int.Parse(startIntervalFromNow), 0, 0, 0);
      default:
         return new TimeSpan(0, 0, 0, 0);
   }
}

public static string CopyExpirationTimeFromPolicy(string policyStatement)
{
   int startExpiration = policyStatement.IndexOf("EpochTime");
   string strExpirationRough = policyStatement.Substring(startExpiration + 
      "EpochTime".Length);
   char[] digits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
         
   List<char> listDigits = new List<char>(digits);
   StringBuilder buildExpiration = new StringBuilder(20);
         
   foreach (char c in strExpirationRough)
   {
      if (listDigits.Contains(c))
         buildExpiration.Append(c);
   }
   return buildExpiration.ToString();   
}
```

Consulte também
+ [Criar uma assinatura de URL usando Perl](CreateURLPerl.md)
+ [Criar uma assinatura de URL usando PHP](CreateURL_PHP.md)
+ [Criar uma assinatura de URL usando Java](CFPrivateDistJavaDevelopment.md)

# Criar uma assinatura de URL usando Java
<a name="CFPrivateDistJavaDevelopment"></a>

Além do exemplo de código a seguir, você pode usar [a classe de utilitário `CloudFrontUrlSigner` no AWS SDK para Java (versão 1)](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/cloudfront/CloudFrontUrlSigner.html) para criar [signed URLs do CloudFront](private-content-signed-urls.md).

Para ver mais exemplos, consulte [Crie URLs e cookies assinados usando um SDK da AWS](https://docs.aws.amazon.com/code-library/latest/ug/cloudfront_example_cloudfront_CloudFrontUtilities_section.html) na *Biblioteca de códigos de exemplos de códigos do SDK da AWS*. 

**nota**  
Criar um signed URL é somente uma parte do processo de [fornecimento de conteúdo privado com o CloudFront](PrivateContent.md). Para obter mais informações sobre o todo o processo, consulte [Usar URLs assinados](private-content-signed-urls.md).

O exemplo a seguir mostra como criar um signed URL do CloudFront.

**Example Política Java e métodos de criptografia de assinatura**  <a name="ExampleJavaPolicyAndSignatureEncryptionMethods"></a>

```
package org.example;

import java.time.Instant;
import java.time.temporal.ChronoUnit;
import software.amazon.awssdk.services.cloudfront.CloudFrontUtilities;
import software.amazon.awssdk.services.cloudfront.model.CannedSignerRequest;
import software.amazon.awssdk.services.cloudfront.url.SignedUrl;

public class Main {

    public static void main(String[] args) throws Exception {
        CloudFrontUtilities cloudFrontUtilities = CloudFrontUtilities.create();
        Instant expirationDate = Instant.now().plus(7, ChronoUnit.DAYS);
        String resourceUrl = "https://a1b2c3d4e5f6g7.cloudfront.net";
        String keyPairId = "K1UA3WV15I7JSD";
        CannedSignerRequest cannedRequest = CannedSignerRequest.builder()
                .resourceUrl(resourceUrl)
                .privateKey(new java.io.File("/path/to/private_key.pem").toPath())
                .keyPairId(keyPairId)
                .expirationDate(expirationDate)
                .build();
        SignedUrl signedUrl = cloudFrontUtilities.getSignedUrlWithCannedPolicy(cannedRequest);
        String url = signedUrl.url();
        System.out.println(url);

    }
}
```

Consulte também:
+ [Criar uma assinatura de URL usando Perl](CreateURLPerl.md)
+ [Criar uma assinatura de URL usando PHP](CreateURL_PHP.md)
+ [Criar uma assinatura de URL usando C\$1 e o .NET Framework](CreateSignatureInCSharp.md)