

**Esta documentação é somente para a versão 1 da AWS CLI.**

Anunciamos o próximo fim do suporte para a AWS CLI versão 1. É recomendável migrar para a AWS CLI versão 2. Para saber as datas e receber detalhes e informações adicionais sobre como migrar, consulte o [anúncio](https://aws.amazon.com/blogs/developer/cli-v1-maintenance-mode-announcement/). Para obter a documentação relacionada à AWS CLI versão 2, consulte o [Guia do usuário da versão 2](https://docs.aws.amazon.com/cli/latest/userguide/).

# Aplicar uma versão mínima do TLS na AWS CLI
<a name="cli-security-enforcing-tls"></a>

Ao usar a AWS Command Line Interface (AWS CLI), o protocolo Transport Layer Security (TLS) desempenha um papel crucial na proteção da comunicação entre a AWS CLI e os Serviços da AWS. Para aumentar a segurança ao se comunicar com serviços da AWS, você deve usar o TLS 1.2 ou posterior.

A AWS CLI e o AWS service (Serviço da AWS) podem trocar dados com segurança, com o protocolo TLS fornecendo criptografia, autenticação e integridade dos dados. Ao usar o protocolo TLS, a AWS CLI garante que suas interações com Serviços da AWS sejam protegidas contra acesso não autorizado e violações de dados, aumentando a segurança geral do seu ecossistema da AWS.

O AWS [modelo de responsabilidade compartilhada](https://aws.amazon.com/compliance/shared-responsibility-model/) se aplica à proteção de dados no AWS Command Line Interface. Conforme descrito nesse modelo, AWS é responsável por proteger a infraestrutura global que executa todas as Serviços da AWS. Você é responsável por manter o controle sobre o conteúdo hospedado nessa infraestrutura. Você também é responsável pelas tarefas de configuração e gerenciamento de segurança dos Serviços da AWS que usa. Para mais informações sobre a proteção de dados, consulte [Proteção de dados no AWS CLI](data-protection.md).

Para garantir que a AWS CLI versão 1 não use uma versão do TLS anterior ao TLS 1.2, talvez seja necessário recompilar o OpenSSL para impor esse mínimo e recompilar o Python para usar o OpenSSL recém-criado. 

**Topics**
+ [Determinar os protocolos atualmente compatíveis](#enforcing-tls-supported)
+ [Compilar OpenSSL e Python](#enforcing-tls-compile)

## Determinar os protocolos atualmente compatíveis
<a name="enforcing-tls-supported"></a>

Primeiro, crie um certificado autoassinado a ser usado para o servidor de teste e o Python SDK usando OpenSSL.

```
$ openssl req -subj '/CN=localhost' -x509 -newkey rsa:4096 -nodes -keyout key.pem -out cert.pem -days 365
```

Depois, crie um servidor de teste usando OpenSSL.

```
$ openssl s_server -key key.pem -cert cert.pem -www
```

Em uma nova janela do terminal, crie um ambiente virtual e instale o SDK for Python.

```
$ python3 -m venv test-env
source test-env/bin/activate
pip install botocore
```

Crie um script Python chamado `check.py` que usa a biblioteca HTTP subjacente do SDK.

```
$ import urllib3
URL = 'https://localhost:4433/'

http = urllib3.PoolManager(
    ca_certs='cert.pem',
    cert_reqs='CERT_REQUIRED',
)
r = http.request('GET', URL)
print(r.data.decode('utf-8'))
```

Execute o novo script.

```
$ python check.py
```

Ele exibe detalhes sobre a conexão feita. Procure “Protocol : ” na saída. Se a saída for “TLSv1.2” ou posterior, o SDK definirá como padrão TLS v1.2 ou posterior. Se for uma versão anterior, é necessário recompilar o OpenSSL e recompilar o Python.

No entanto, mesmo que a instalação do Python defina como padrão TLS v1.2 ou posterior, ainda será possível que o Python renegocie para uma versão anterior ao TLS v1.2 se o servidor não for compatível com TLS v1.2 ou posterior. Para verificar se o Python não renegocia automaticamente para versões anteriores, reinicie o servidor de teste com o seguinte.

```
$ openssl s_server -key key.pem -cert cert.pem -no_tls1_3 -no_tls1_2 -www
```

Se estiver usando uma versão anterior do OpenSSL, talvez você não tenha o sinalizador `-no_tls_3` disponível. Se esse for o caso, remova o sinalizador porque a versão do OpenSSL que você está usando não é compatível com TLS v1.3. Execute novamente o script Python.

```
$ python check.py
```

Se a instalação do Python não renegocia para versões anteriores ao TLS 1.2 corretamente, você deve receber um erro SSL.

```
$ urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='localhost', port=4433): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, '[SSL: UNSUPPORTED_PROTOCOL] unsupported protocol (_ssl.c:1108)')))
```

Se você conseguir fazer uma conexão, será necessário recompilar o OpenSSL e o Python para desabilitar a negociação de protocolos anteriores ao TLS v1.2.

## Compilar OpenSSL e Python
<a name="enforcing-tls-compile"></a>

Para garantir que o SDK ou a AWS CLI não negocie nada anterior ao TLS 1.2, é necessário recompilar o OpenSSL e o Python. Para fazer isso, copie o seguinte conteúdo para criar um script e executá-lo.

```
#!/usr/bin/env bash
set -e

OPENSSL_VERSION="1.1.1d"
OPENSSL_PREFIX="/opt/openssl-with-min-tls1_2"
PYTHON_VERSION="3.8.1"
PYTHON_PREFIX="/opt/python-with-min-tls1_2"


curl -O "https://www.openssl.org/source/openssl-$OPENSSL_VERSION.tar.gz"
tar -xzf "openssl-$OPENSSL_VERSION.tar.gz"
cd openssl-$OPENSSL_VERSION
./config --prefix=$OPENSSL_PREFIX no-ssl3 no-tls1 no-tls1_1 no-shared
make > /dev/null
sudo make install_sw > /dev/null


cd /tmp
curl -O "https://www.python.org/ftp/python/$PYTHON_VERSION/Python-$PYTHON_VERSION.tgz"
tar -xzf "Python-$PYTHON_VERSION.tgz"
cd Python-$PYTHON_VERSION
./configure --prefix=$PYTHON_PREFIX --with-openssl=$OPENSSL_PREFIX --disable-shared > /dev/null
make > /dev/null
sudo make install > /dev/null
```

Isso compila uma versão do Python que tem um OpenSSL vinculado estaticamente que não negocia automaticamente nada anterior ao TLS 1.2. Isso também instala o OpenSSL no diretório `/opt/openssl-with-min-tls1_2` e instala o Python no diretório `/opt/python-with-min-tls1_2`. Depois de executar esse script, verifique a instalação da nova versão do Python.

```
$ /opt/python-with-min-tls1_2/bin/python3 --version
```

Isso deve imprimir o seguinte.

```
$ Python 3.8.1
```

Para verificar se essa nova versão do Python não negocia uma versão anterior ao TLS 1.2, execute novamente as etapas em [Determinar os protocolos atualmente compatíveis](#enforcing-tls-supported) usando a versão do Python recém-instalada (ou seja, `/opt/python-with-min-tls1_2/bin/python3`).