將服務從 HTTP 變為 HTTPS,需要進行 SSL 證書的配置。需要完成一下步驟: 獲取 SSL 證書 安裝 SSL 證書 配置 Nginx 支持 HTTPS 重啟 Nginx HTTP 到 HTTPS 的重定向(可選) 1. 獲取 SSL 證書(自簽名證書) 對於 SSL/TLS 證書,一般來 ...
將服務從 HTTP
變為 HTTPS
,需要進行 SSL
證書的配置。需要完成一下步驟:
- 獲取
SSL
證書 - 安裝
SSL
證書 - 配置 Nginx 支持
HTTPS
- 重啟 Nginx
HTTP
到HTTPS
的重定向(可選)
1. 獲取 SSL
證書(自簽名證書)
對於 SSL/TLS
證書,一般來說,它們是基於 功能變數名稱 進行頒發的,而不是 IP地址。這是因為 SSL/TLS
證書是用來驗證伺服器身份和提供一個安全的連接通道的,它們需要關聯到一個被認可的功能變數名稱以確保伺服器的真實性。
如果你沒有 功能變數名稱,但是你的應用又需要使用 HTTPS
,那麼以下幾種方式或許可以考慮:
- 購買一個功能變數名稱:
功能變數名稱現在相當便宜,你可以購買一個,並將其解析到你的 IP 地址。 - 自簽名證書:
可以創建自己的自簽名證書。但是,用戶的瀏覽器會顯示一個警告,提示他們證書不受信任。這可能不適合面向公眾的應用程式,但對於測試或內部使用的服務來說,這是一個可行的選擇。 - 使用 CloudFlare
CloudFlare 是一個內容分髮網絡(CDN)和 DNS 提供商,它提供免費的SSL
證書,即使你沒有功能變數名稱也可以使用。但是,這需要將你的流量通過他們的網路,可能並不適合所有應用。
1.1. 安裝 openssl
// 更新 apt-get 下載源節點
sudo apt-get update
// 查看當前 apt-get 下載源節點里 libssl-dev 可下載安裝的所有版本和預設的最合適的版本
sudo apt-cache policy libssl-dev
// 下載並預設安裝 libssl-dev(預設的版本)
sudo apt-get install libssl-dev
// 如果要指定安裝某個版本
//sudo apt-get install libssl-dev=版本號
1.2. 自簽名證書
使用 OpenSSL 工具來創建自己的自簽名證書
- 生成私鑰
打開命令行,然後輸入以下命令來生成一個新的 RSA 私鑰:openssl genrsa -out server.key 2048
,將在當前目錄下生成一個名為server.key
的 2048 位私鑰文件。 - 生成證書簽名請求(CSR)
使用此命令生成 CSR(Certificate Signing Request):openssl req -new -key server.key -out server.csr
,會提示輸入很多東西,一直按 enter 即可 - 生成自簽名證書
最後,使用以下命令生成自簽名證書:openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
,這將生成一個有效期為一年的自簽名證書 server.crt。
1.3. 嘗試在 flask 應用中使用
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "Hello World"
if __name__ == "__main__":
app.run(ssl_context=('server.crt', 'server.key'), host='0.0.0.0', port=8080)
#app.run(host='0.0.0.0', port=8080)
這樣,Flask 伺服器就會在 HTTPS
上運行了。但是,請註意,因為使用的是自簽名證書,所以瀏覽器將警告用戶這個連接不安全(因為證書不是由受信任的證書頒發機構簽署的)。對於公開服務,應該考慮獲得一個由公認的 CA 簽署的證書。
- 直接在 flask 中使用 ssl 證書的示意圖:
2. 安裝 SSL
證書
將上面生成的 SSL 證書文件放置到位於 /etc/nginx/ssl/
目錄中。確保已經擁有了伺服器私鑰(server.key
)和證書文件(server.crt
或 server.crt
)。
3. 配置 Nginx
支持 HTTPS
3.1. 打開 Nginx 配置文件
Nginx 的配置文件通常位於 /etc/nginx/ 目錄下,具體取決於你的系統和 Nginx 安裝方式。大部分情況下,站點特定的配置在 /etc/nginx/sites-available/ 中。
3.2. 修改或增加一個server塊
在 /etc/nginx/sites-available/default 配置文件中,將文件中的內容全部替換為下麵的 server 模塊(或者新建一個使用 SSL 的 server 塊),內容如下:
server {
listen 443 ssl;
server_name _;
# server_name your-domain.com; # 沒有功能變數名稱則直接寫一個下劃線即可
ssl_certificate /etc/nginx/ssl/server.crt; # 修改為證書路徑
ssl_certificate_key /etc/nginx/ssl/server.key; # 修改為私鑰路徑
location / {
proxy_pass http://127.0.0.1:8080; # 修改為 http 服務地址
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
- 替換 your-domain.com 為真實的功能變數名稱,沒有功能變數名稱則直接寫一個下劃線(_)即可。
listen 443 ssl
告訴 Nginx 在 443 埠上監聽 SSL 連接。ssl_certificate
和ssl_certificate_key
指令分別指向你的證書文件和私鑰文件的實際路徑。
4. 重啟 Nginx
保存並關閉配置文件,然後運行以下命令來檢查新的配置是否有語法錯誤:
sudo nginx -t
如果這個命令沒有報錯,就可以安全地重啟 Nginx:
sudo systemctl restart nginx
nginx 重啟成功後,將可以在瀏覽器上通過 https 訪問伺服器應用了。由於使用的是自簽名證書,用戶的瀏覽器將顯示一個警告,提示他們此證書不受信任。這對於測試和開發環境可能沒問題,但是如果計劃在生產環境中使用 SSL,應該考慮從一個可信的證書頒發機構獲取一個證書。
- 使用 nginx 作為反向代理後,使用 ssl 證書的示意圖:
5. HTTP 到 HTTPS 的重定向(可選)
如果希望所有的 HTTP 流量都自動跳轉到 HTTPS,可以在 Nginx 配置中添加以下內容:
server {
listen 80;
server_name your-domain.com;
return 301 https://$host$request_uri;
}
這段配置會捕獲所有到埠 80(HTTP) 的請求,並將它們重定向到相同地址的 HTTPS 版本。