本文介紹在Python Flask本地程式開發伺服器配置SSL認證的具體步驟,包括下載和上傳認證檔案,在Flask run配置認證檔案和認證密鑰,以及安裝認證後結果的驗證。
適用範圍
開始配置前,確保滿足以下條件:
認證狀態:已擁有由權威機構簽發的 SSL 憑證。若認證即將到期或已到期,請先續約SSL認證。
網域名稱匹配:確保認證能夠匹配所有需保護的網域名稱。如需添加或修改網域名稱,可根據需求購買正式認證或追加和更換網域名稱。
精確網域名稱:僅對指定網域名稱生效。
example.com僅對example.com生效。www.example.com僅對www.example.com生效。
萬用字元網域名稱:僅對其一級子網域名稱生效。
*.example.com對www.example.com、a.example.com等一級子網域名稱生效。*.example.com對根網域名稱example.com和多級子網域名稱a.b.example.com不生效。
說明如需匹配多級子網域名稱,綁定網域名稱中需包含該網域名稱(如
a.b.example.com),或包含相應的萬用字元網域名稱(如*.b.example.com)。伺服器許可權:需要使用
root賬戶或一個具有sudo許可權的賬戶。網域名稱解析:網域名稱已配置解析記錄並解析至伺服器的公網 IP。
環境依賴:伺服器已安裝Python和Flask。本文以Linux作業系統、Python 3.6和Flask 2.0.3為例進行介紹。
操作步驟
步驟一:準備SSL認證
步驟二:配置系統與網路環境
確保安全性群組和防火牆允許外部流量訪問。
在伺服器終端執行以下命令,檢測443連接埠的開放情況:
RHEL/CentOS
command -v nc > /dev/null 2>&1 || sudo yum install -y nc # 請將以下的 <當前伺服器的公網 IP> 替換為當前伺服器的公網 IP sudo ss -tlnp | grep -q ':443 ' || sudo nc -l 443 & sleep 1; nc -w 3 -vz <當前伺服器的公網 IP> 443如果輸出
Ncat: Connected to <當前伺服器公網 IP>:443,則表明443連接埠已開放。否則需在安全性群組和防火牆中開放443連接埠。Debian/Ubuntu
command -v nc > /dev/null 2>&1 || sudo apt-get install -y netcat # 請將以下的 <當前伺服器的公網 IP> 替換為當前伺服器的公網 IP sudo ss -tlnp | grep -q ':443 ' || sudo nc -l -p 443 & sleep 1; nc -w 3 -vz <當前伺服器的公網 IP> 443若輸出
Connection to <當前伺服器公網 IP> port [tcp/https] succeeded!或[<當前伺服器公網 IP>] 443 (https) open,則表明443連接埠已開放。否則需在安全性群組和防火牆中開放443連接埠。在安全性群組配置開放443連接埠。
重要若您的伺服器部署在雲平台,請確保其安全性群組已開放 443 連接埠 (TCP),否則外部無法訪問服務。以下操作以阿里雲 ECS 為例,其他雲平台請參考其官方文檔。
進入Elastic Compute Service執行個體,單擊目標執行個體名稱進入執行個體詳情頁面,請參考添加安全性群組規則,在安全性群組中添加一條授權策略為允許、協議類型為 TCP、目的連接埠範圍為 HTTPS(443)、授權對象為任何位置(0.0.0.0/0)的規則。
在防火牆中開放443連接埠。
執行以下命令,識別系統當前的防火牆服務類型:
if command -v systemctl >/dev/null 2>&1 && systemctl is-active --quiet firewalld; then echo "firewalld" elif command -v ufw >/dev/null 2>&1 && sudo ufw status | grep -qw active; then echo "ufw" elif command -v nft >/dev/null 2>&1 && sudo nft list ruleset 2>/dev/null | grep -q 'table'; then echo "nftables" elif command -v systemctl >/dev/null 2>&1 && systemctl is-active --quiet iptables; then echo "iptables" elif command -v iptables >/dev/null 2>&1 && sudo iptables -L 2>/dev/null | grep -qE 'REJECT|DROP|ACCEPT'; then echo "iptables" else echo "none" fi若輸出為
none,則無需進一步操作。否則,請根據輸出的類型(firewalld、ufw、nftables、iptables),執行以下命令開放 443 連接埠:firewalld
sudo firewall-cmd --permanent --add-port=443/tcp && sudo firewall-cmd --reloadufw
sudo ufw allow 443/tcpnftables
sudo nft add table inet filter 2>/dev/null sudo nft add chain inet filter input '{ type filter hook input priority 0; }' 2>/dev/null sudo nft add rule inet filter input tcp dport 443 counter accept 2>/dev/nulliptables
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT為避免 iptables 規則在系統重啟後失效,請執行以下命令持久化 iptables 規則:
RHEL/CentOS
sudo yum install -y iptables-services sudo service iptables saveDebian/Ubuntu
sudo apt-get install -y iptables-persistent sudo iptables-save | sudo tee /etc/iptables/rules.v4 >/dev/null
步驟三:在Flask網站安裝認證
執行以下命令,在Linux伺服器的
/目錄下建立一個用於存放認證的目錄。mkdir /ssl #建立認證目錄,命名為ssl。將認證檔案和私密金鑰檔案上傳到Linux伺服器的認證目錄(
/ssl)。說明您可以使用遠程登入工具的本地檔案上傳功能來上傳檔案。例如PuTTY、Xshell或WinSCP等工具。如果您使用的是阿里雲Elastic Compute Service,關於上傳檔案的具體操作,請參見上傳或下載檔案。
開啟Flask應用檔案,參考以下範例程式碼配置認證。
以下是一段完整的Flask應用範例程式碼。您可以複製代碼內容,並在修改憑證路徑後儲存為test.py以進行測試回合。
# 引入 flask web 架構 from flask import Flask app = Flask(__name__) @app.route("/") def main(): return "<p>Hello, World!</p>" # 配置SSL認證 # HTTPS的預設訪問連接埠443。 # 配置443連接埠和認證絕對路徑。'/ssl/cert.pem'需替換為認證檔案絕對路徑。'/ssl/cert.key'需替換為認證私密金鑰絕對路徑。 context = (r'/ssl/cert.pem', r'/ssl/cert.key') app.run(host="0.0.0.0", port=443, ssl_context=context)進入test.py檔案所在的目錄,執行以下命令,重啟flask服務。
# test.py 為本文樣本,請替換為您實際儲存的檔案名稱。 python test.py
步驟四:重啟Flask應用驗證SSL認證是否配置成功
請通過 HTTPS 訪問您已綁定認證的網域名稱(如
https://example.com,example.com需替換為實際網域名稱)。若瀏覽器地址欄顯示安全鎖表徵圖,說明認證已成功部署。如訪問異常或未顯示安全鎖,請先清除瀏覽器緩衝或使用無痕(隱私)模式重試。

Chrome 瀏覽器自 117 版本起,地址欄中的
已被新的
替代,需單擊該表徵圖後查看安全鎖資訊。
如仍有問題,請參考常見問題進行排查。
應用於生產環境
在生產環境部署時,遵循以下最佳實務可提升安全性、穩定性和可維護性:
使用非管理員權限使用者運行:
為應用建立專用的、低許可權的系統使用者,切勿使用擁有管理員權限的賬戶運行應用。
說明建議使用網關層配置 SSL的方案,即將認證部署在Server Load Balancer或Nginx等反向 Proxy上,由其終結 HTTPS 流量,再將解密後的 HTTP 流量轉寄到後端應用。
憑證外部化管理:
切勿將密碼等敏感資訊寫入程式碼在代碼或設定檔中。使用環境變數、Vault 或雲端服務商提供的Key Management Service來注入憑證。
啟用 HTTP 到 HTTPS 強制跳轉:
確保所有通過 HTTP 訪問的流量都被自動重新導向到 HTTPS,防止中間人攻擊。
配置現代 TLS 協議:
在伺服器配置中禁用老舊且不安全的協議(如 SSLv3, TLSv1.0, TLSv1.1),僅啟用 TLSv1.2 和 TLSv1.3。
認證監控與自動續期:
建議在認證部署完成後,為網域名稱開啟網域名稱監控功能。阿里雲將自動檢測認證有效期間,並在認證到期前發送提醒,協助您及時續期,避免服務中斷。具體操作請參見購買並開啟公網網域名稱監控。
常見問題
安裝或更新認證後,認證未生效或 HTTPS 無法訪問
常見原因如下:
伺服器安全性群組或防火牆未開放 443 連接埠。請參見配置系統與網路環境。
認證的綁定網域名稱未包含當前訪問的網域名稱。請參見網域名稱匹配。
修改 Flask 應用檔案配置後,未重啟Flask服務。具體操作可參見停止並重啟Flask服務。
認證檔案未正確替換,或 Flask 配置未正確指定憑證路徑。請檢查 Flask 應用檔案的認證配置和所用認證檔案是否為最新且有效。
網域名稱已接入 CDN、SLB 或 WAF 等雲產品,但未在相應產品中安裝認證。請參閱流量經過多個雲產品時認證的部署位置完成相關操作。
當前網域名稱的 DNS 解析指向多台伺服器,但認證僅在部分伺服器上安裝。需分別在每個伺服器中安裝認證。
如需進一步排查,請參考:根據瀏覽器錯誤提示解決認證部署問題 和 SSL認證部署故障自助排查指南。
如何更新(替換)Flask 中已安裝的 SSL 憑證
請先備份伺服器上原有的認證檔案(.pem 和 .key),然後登入數位憑證管理服務控制台,下載新的認證檔案,並上傳到目標伺服器覆蓋原有檔案(確保路徑和檔案名稱一致)。最後,重啟Flask服務,使新認證生效。
啟動Flask應用時報錯 FileNotFoundError
此問題通常由檔案路徑錯誤導致。請檢查 ssl_context 中提供的認證和私密金鑰檔案路徑是否正確。路徑應相對於運行 python app.py 命令的目前的目錄,或使用絕對路徑。
瀏覽器提示 "ERR_SSL_PROTOCOL_ERROR" 或串連被重設
請檢查以下幾點:
認證檔案與私密金鑰檔案是否匹配。
使用的認證檔案是否是完整的憑證鏈結(通常是
.pem檔案)。阿里雲下載的認證檔案已包含完整憑證鏈結。伺服器的安全性群組或防火牆是否已正確允許存取HTTPS連接埠(本例中為
443)。