本文件 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 CLI 版本 1 沒有使用早於 TLS 1.2 的TLS版本,您可能需要重新編譯 OpenSSL 以強制執行此最小值,然後重新編譯 Python 以使用新建置的 Open SSL。
判定目前支援的通訊協定
首先,SDK使用 Open 建立自我簽署憑證,用於測試伺服器和 PythonSSL。
$
openssl req -subj '/CN=localhost' -x509 -newkey rsa:4096 -nodes -keyout key.pem -out cert.pem -days 365
然後使用 Open 啟動測試伺服器SSL。
$
openssl s_server -key key.pem -cert cert.pem -www
在新的終端機視窗中,建立虛擬環境並安裝 SDK for Python。
$
python3 -m venv test-env source test-env/bin/activate pip install botocore
建立名為 的新 Python 指令碼check.py
,使用 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 仍然可以重新交涉至 v1.2 或更新版本之前的TLS版本。若要確保 Python 不會自動與較早版本重新交涉,請使用以下命令重新啟動測試伺服器。
$
openssl s_server -key key.pem -cert cert.pem -no_tls1_3 -no_tls1_2 -www
如果您使用的是舊版的 Open SSL,則可能沒有可用的-no_tls_3
旗標。如果發生這種情況,請移除旗標,因為您使用的 OpenSSL 版本不支援 TLS v1.3。然後執行 Python 指令碼。
$
python check.py
如果您的 Python 正確安裝未針對 1.2 TLS 之前的版本重新交涉,您應該會收到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,以停用 v1TLS.2 之前的通訊協定交涉。
編譯 OpenSSL 和 Python
為了確保 SDK或 AWS CLI 不會針對 1.2 TLS 之前的任何內容進行交涉,您需要重新編譯 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
這會編譯具有靜態連結 OpenSSL 的 Python 版本,該 Open 不會自動交涉早於 1.2 TLS 的任何內容。這也會在 /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 未交涉比 1.2 TLS 更早的版本,請重新執行判定目前支援的通訊協定使用新安裝的 Python 版本 (即 /opt/python-with-min-tls1_2/bin/python3
) 的步驟。