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

本文件僅適用於第 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 Command Line Interface。如此模型中所述, AWS 負責保護執行所有 AWS services. 您負責維護在此基礎設施上託管內容的控制權。您也必須負責所使用的安全性組態與管理工作。 AWS services 如需有關資料保護的詳細資訊,請參閱AWS CLI 中的資料保護

為了確保 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) 的步驟。