本文件僅適用於第 1 AWS CLI 版。如需與版本 2 的相關文件 AWS CLI,請參閱第 2 版使用者指南。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
強制執行的最低版本 TLS
使用 AWS Command Line Interface (AWS CLI) 時,傳輸層安全性 (TLS) 通訊協定在保護 AWS CLI 和之間的通訊安全方面扮演至關重要的角色 AWS services。若要在與 AWS 服務通訊時增加安全性,您應該使用 TLS 1.2 或更新版本。
AWS CLI 和 AWS service 可以使用提供加密、驗證和資料完整性的TLS通訊協定來安全地交換資料。通過利用該TLS協議, AWS CLI 可確保您的互動受到保護,免 AWS services 受未經授權的訪問和數據洩露,從而增強了 AWS 生態系統的整體安全性。
AWS 共用責任模型
為了確保 AWS CLI 版本 1 不使用 TLS 1.2 之前的TLS版本,您可能需要重新編譯 Open SSL 以強制執行此最小值,然後重新編譯 Python 以使用新構建的 Open。SSL
判定目前支援的通訊協定
首先,使用 O SSL pen 創建用於測試服務器和 Python SDK 的自簽名證書。
$
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
建立名為check.py
使用基礎程式HTTP庫SDK的新 Python 指令碼。
$
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 或更新版本。如果它是早期版本,則需要重新編譯打開SSL並重新編譯 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
旗標。如果是這種情況,請刪除標誌,因為SSL您使用的 Open 版本不支持 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)')))
如果你能夠建立一個連接,你需要重新編譯 Open SSL 和 Python 來禁用早於 TLS v1.2 的協議的協議協商。
編譯開放SSL和 Python
為了確保SDK或 AWS CLI 不會針對 TLS 1.2 之前的任何內容進行協商,您需要重新編譯 Open SSL 和 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
這編譯了一個具有靜態鏈接 Open 的 Python 版本,SSL該版本不會自動協商早於 TLS 1.2 的任何內容。這也會在/opt/openssl-with-min-tls1_2
目錄SSL中安裝「開啟」,並在/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
) 的步驟。