沒有加密的http服務,就像在裸泳,鉆到水里便將你看個精光。數據在互聯網上傳輸時,如果未經加密,隨時可能被抓包軟件抓住,里面的cookie、用戶名、密碼什么的,它會看得一清二楚,所以,只要你的項目上網,就必須加載ssl證書,它的重要性風云以前的博文有詳細介紹,這里不再贅述。實現https服務,風云在flask系列博文有關于flask項目的安全與部署,但是部署ssl證書介紹得比較籠統,今天補充一篇,在 Flask 中配置 SSL 證書并實現 HTTPS 服務,步驟如下:
步驟 1:獲取 SSL 證書
首先,您需要獲得一個 SSL 證書。您可以選擇購買一個商用證書,也可以使用免費證書提供商,如 Let's Encrypt。這里我們會使用 自簽名證書?來做演示。
1.1 創建自簽名 SSL 證書(適用于測試環境)
可以通過 OpenSSL 創建一個自簽名證書,適合本地開發和測試。
命令:
openssl req -x509 -newkey rsa:4096 -keyout ssl.key -out ssl.crt -days 365
-newkey rsa:4096:生成 4096 位的 RSA 密鑰。
-keyout ssl.key:指定私鑰的保存文件。
-out ssl.crt:指定證書的保存文件。
-days 365:設置證書的有效期為 365 天。
生成的 ssl.key?為私鑰,ssl.crt?為公鑰證書。
看到生成的兩個文件:ssl.crt、ssl.key 則表示成功。當然,此證書為自簽名證書,只適合于測試環境,如果上生產環境,還需專有數字證書,可以上阿里云等申請時長為3個月的免費證書。
步驟 2:在 Flask 中配置 SSL 證書
Flask 的開發服務器支持通過 ssl_context?配置 SSL 證書。您只需在 app.run()?中設置相應的參數。
2.1 配置 Flask 啟動 SSL 服務
首先,確保你已經生成了 SSL 證書文件和私鑰文件(如 ssl.crt?和 ssl.key)。
然后,修改 Flask 應用啟動代碼,使其支持 HTTPS。
from?flask import?Flaskapp = Flask(__name__)@app.route('/')
def?hello():return?"Hello, SSL Flask!"if?__name__ == '__main__':# 指定 SSL 證書和私鑰文件app.run(ssl_context=('ssl.crt', 'ssl.key'), host='0.0.0.0', port=443, debug=True)
解釋:
ssl_context=('ssl.crt', 'ssl.key'):通過此參數指定證書文件和私鑰文件。
host='0.0.0.0':監聽所有的 IP 地址。
port=443:使用 HTTPS 默認端口 443。
啟動應用后,訪問 https://localhost/?即可通過 HTTPS 訪問您的 Flask 應用。
步驟 3:配置 Nginx 作為反向代理
在生產環境中,建議通過 Nginx 作為反向代理將 HTTP 請求轉發到 Flask 后端,提升性能和安全性。
3.1 安裝 Nginx
sudo apt update
sudo apt install nginx
3.2 配置 Nginx 反向代理
編輯 Nginx 配置文件,配置 HTTPS 和反向代理。
sudo nano /etc/nginx/sites-available/yourapp
配置文件內容如下:
server?{listen?443?ssl;server_name?example.com;ssl_certificate?/path/to/ssl.crt;ssl_certificate_key?/path/to/ssl.key;location?/ {proxy_pass?http://127.0.0.1:5000; ?# Flask 應用監聽的端口proxy_set_header?Host $host;proxy_set_header?X-Real-IP $remote_addr;proxy_set_header?X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header?X-Forwarded-Proto $scheme;}
}server?{listen?80;server_name?example.com;return?301?https://$host$request_uri; ?# 將所有 http 請求重定向到 https
}
解釋:
listen 443 ssl;:Nginx 在端口 443 上監聽 HTTPS 請求。
ssl_certificate?和 ssl_certificate_key:指定 SSL 證書和私鑰路徑。
proxy_pass:將請求代理到 Flask 后端應用(假設 Flask 應用運行在 5000 端口)。
return 301 https://$host$request_uri;:將所有的 HTTP 請求重定向到 HTTPS。
3.3 啟動 Nginx
創建符號鏈接以啟用配置,并重啟 Nginx 服務:
sudo ln?-s /etc/nginx/sites-available/yourapp /etc/nginx/sites-enabled/
sudo systemctl restart nginx
步驟 4:使用 Let's Encrypt 配置 HTTPS(生產環境)
對于生產環境,推薦使用 Let's Encrypt?免費的 SSL 證書。
4.1 安裝 Certbot
首先,安裝 Certbot 以便從 Let's Encrypt 獲取 SSL 證書。
sudo apt install certbot python3-certbot-nginx
4.2 獲取證書
使用 Certbot 自動獲取并配置 SSL 證書:
sudo certbot --nginx -d example.com
Certbot 會自動為您生成證書并配置 Nginx。
4.3 自動續期
Let’s Encrypt 的證書有效期為 90 天,因此需要設置自動續期。您可以通過以下命令測試自動續期:
sudo certbot renew --dry-run
如果測試成功,Certbot 將在每次系統更新時自動續期證書。
總結
通過以下步驟,您可以在 Flask 應用中實現 HTTPS 服務:
獲取 SSL 證書:可以使用自簽名證書或者通過 Let's Encrypt 獲取免費證書。
配置 Flask 啟動 HTTPS 服務:使用 Flask 內置的 ssl_context?參數啟動 HTTPS 服務。
配置 Nginx 反向代理:在生產環境中,使用 Nginx 來管理 HTTPS 連接,提升性能。
Let's Encrypt 配置:對于生產環境,使用 Certbot 獲取免費的 SSL 證書并配置自動續期。
通過這些步驟,您可以成功在 Flask 應用中實現 HTTPS 服務,確保您的應用安全可靠。