

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Applicazione di una versione minima di TLS 1.2
<a name="security-enforcing-tls"></a>

Per aumentare la sicurezza durante la comunicazione con AWS i servizi, è necessario configurare l'utilizzo di TLS AWS ParallelCluster 1.2 o versione successiva. Quando si utilizza AWS ParallelCluster, Python viene utilizzato per impostare la versione TLS.

Per garantire che non AWS ParallelCluster utilizzi una versione TLS precedente a TLS 1.2, potrebbe essere necessario ricompilare OpenSSL per applicare questo valore minimo e quindi ricompilare Python per utilizzare OpenSSL di nuova generazione. 

## Determinare i protocolli attualmente supportati
<a name="enforcing-tls-supported"></a>

Innanzitutto, creare un certificato autofirmato da utilizzare per il server di test e per l'SDK Python che utilizza OpenSSL.

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

Quindi avviare un server di test usando OpenSSL.

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

In una nuova finestra del terminale, creare un ambiente virtuale e installare Python SDK.

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

Creare un nuovo script Python denominato `check.py` che utilizza la libreria HTTP sottostante dell'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'))
```

Eseguire il nuovo script.

```
$ python check.py
```

In questo modo vengono visualizzati i dettagli sulla connessione effettuata. Ricercare "Protocol : " nell'output. Se l'output è "TLSv1.2" o successivo, l'SDK utilizza per impostazione predefinita TLS v1.2 o versione successiva. Se si tratta di una versione precedente, è necessario ricompilare OpenSSL e ricompilare Python.

Tuttavia, anche se l'installazione di Python è impostata su TLS v1.2 o versioni successive, è comunque possibile per Python rinegoziare una versione precedente a TLS v1.2 se il server non supporta TLS v1.2 o versioni successive. Per verificare che Python non rinegozi automaticamente su versioni precedenti, riavviare il server di test con quanto segue.

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

Se si sta utilizzando una versione precedente di OpenSSL, il flag `-no_tls_3` potrebbe non essere disponibile. In questo caso, rimuovere il flag perché la versione di OpenSSL che si sta utilizzando non supporta TLS v1.3. Eseguire lo script Python.

```
$ python check.py
```

Se l'installazione di Python non rinegozia correttamente per le versioni precedenti a TLS 1.2, si dovrebbe ricevere un errore 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 si è in grado di stabilire una connessione, ricompilare OpenSSL e Python per disabilitare la negoziazione dei protocolli precedenti a TLS v1.2.

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

Per assicurarti che AWS ParallelCluster ciò non valga per nulla precedente a TLS 1.2, devi ricompilare OpenSSL e Python. A tale scopo, copiare il contenuto seguente per creare uno script ed eseguirlo.

```
#!/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
```

Questa operazione esegue la compilazione di una versione di Python che ha un OpenSSL collegato staticamente che non negozia automaticamente versioni precedenti a TLS 1.2. Questa operazione installa anche OpenSSL nella directory `/opt/openssl-with-min-tls1_2` e installa Python nella directory `/opt/python-with-min-tls1_2`. Dopo aver eseguito questo script, confermare l'installazione della nuova versione di Python.

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

Questa operazione dovrebbe stampare quanto segue.

```
Python 3.8.1
```

Per confermare che questa nuova versione di Python non negozi una versione precedente a TLS 1.2, eseguire nuovamente le fasi a partire da [Determinare i protocolli attualmente supportati](#enforcing-tls-supported) utilizzando la versione di Python appena installata (ovvero `/opt/python-with-min-tls1_2/bin/python3`).