為 強制執行最低版本的 TLS AWS CLI - AWS Command Line Interface

本文件 AWS CLI 僅適用於 第 1 版。如需 第 2 版的相關文件 AWS CLI,請參閱 第 2 版使用者指南

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

為 強制執行最低版本的 TLS AWS CLI

使用 AWS Command Line Interface () 時AWS CLI,Transport Layer Security (TLS) 通訊協定在保護 AWS CLI 和 之間的通訊方面扮演重要角色 AWS 服務。若要在與服務通訊時增加安全性 AWS ,您應該使用 TLS 1.2 或更新版本。

AWS CLI 和 AWS 服務 可以使用提供加密、身分驗證和資料完整性的 TLS 通訊協定安全地交換資料。透過利用 TLS AWS CLI 通訊協定, 可確保您與 的互動 AWS 服務 不受未經授權的存取和資料外洩影響,進而增強 AWS 生態系統的整體安全性。

AWS 共同責任模型適用於 中的資料保護 AWS Command Line Interface。如此模型所述, AWS 負責保護執行所有 的全域基礎設施 AWS 服務。您負責維護在此基礎設施上託管內容的控制權。您也必須負責 AWS 服務 使用 的安全組態和管理任務。如需資料保護的詳細資訊,請參閱中的資料保護 AWS CLI

為了確保 AWS CLI 版本 1 不使用早於 TLS 1.2 的 TLS 版本,您可能需要重新編譯 OpenSSL 以強制執行此最小值,然後重新編譯 Python 以使用新建置的 OpenSSL。

判定目前支援的通訊協定

首先,使用 OpenSSL 建立用於測試伺服器和 Python SDK 的自簽憑證。

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

然後使用 OpenSSL 啟動測試伺服器。

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

在新的終端機視窗中,建立虛擬環境並安裝適用於 Python 的開發套件。

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

建立一個名為 check.py 的 Python 指令碼,此指令碼使用 SDK 的基礎 HTTP 程式庫。

$ 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'))

執行新的指令碼。

$ python check.py

這會顯示有關所建立連線的詳細資訊。在輸出中搜尋 "Protocol : " (通訊協定:)。如果輸出是 "TLSv1.2" 或更新版本,SDK 就預設為 TLS v1.2 或更新版本。如果是較早的版本,您就必須重新編譯 OpenSSL 再重新編譯 Python。

但是,即使您安裝的 Python 預設為 TLS v1.2 或更新版本,如果伺服器不支援 TLS v1.2 或更新版本,則 Python 仍然可能必須與 TLS v1.2 更早的版本重新交涉。若要確保 Python 不會自動與較早版本重新交涉,請使用以下命令重新啟動測試伺服器。

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

如果您使用的是較早版本的 OpenSSL,您可能無法使用 -no_tls_3 旗標。如果是這種情況,請刪除該旗標,因為您使用的 OpenSSL 版本不支援 TLS v1.3。然後執行 Python 指令碼。

$ python check.py

如果您的 Python 安裝正確,不會與 TLS 1.2 之前的版本重新交涉,您應該會收到 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)')))

如果能夠建立連線,則您必須重新編譯 OpenSSL 和 Python,以禁止與 TLS v1.2 之前的通訊協定交涉。

編譯 OpenSSL 和 Python

為了確保 SDK 或 AWS CLI 不會針對 TLS 1.2 之前的任何內容進行交涉,您需要重新編譯 OpenSSL 和 Python。若要執行此操作,請複製下列內容以建立並執行此指令碼。

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

這樣會編譯一個 Python 版本,內含不會自動與 TLS 1.2 之前任何版本交涉的靜態連結 OpenSSL。這也會在 /opt/openssl-with-min-tls1_2 目錄中安裝 OpenSSL,並在 /opt/python-with-min-tls1_2 目錄中安裝 Python。執行此指令碼之後,確認已安裝新版本的 Python。

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

這應該會列印以下內容。

$ Python 3.8.1

若要確認這個新版本的 Python 不會與 TLS 1.2 之前的版本交涉,請使用新安裝的 Python 版本 (也就是 /opt/python-with-min-tls1_2/bin/python3) 重新執行 判定目前支援的通訊協定 的步驟。