Flask啟用https

rustling發表於2024-07-27

1.生成或獲取SSL證書

使用openssl生成自簽名證書

# req -x509         生成自簽名證書
# -newkey rsa:4096  生成一個新的私鑰,指定為4096位的RSA金鑰對
# -keyout key.pem   私鑰儲存到key.pem檔案
# -out cert.pem     自簽名證書儲存到cert.pem檔案
# -days 365         證書的有效期為365天
# -nodes            不加密私鑰檔案
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes

執行命令後會提示輸入一些資訊,如"Country Name, State or Province Name, Locality Name, Organization Name, Organizational Unit Name, Common Name, Email Address"。這些資訊將被包含在生成的證書中,都可以為空。

或者從可信的證書頒發機構(CA)獲取證書。

2. 在Flask中使用SSL證書

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello, World!"

if __name__ == "__main__":
    # cert.pem是生成的證書檔案,key.pem是生成的私鑰檔案
    app.run(host='0.0.0.0', port='5000', ssl_context=('cert.pem', 'key.pem'))

3. Nginx配置https反向代理

可用nginx -t命令檢視nginx配置檔案路徑,預設在/etc/nginx/nginx.conf

    server {
        listen 80;
        server_name yourdomain.com;
        # HTTP重定向到HTTPS
        return 301 https://$host$request_uri;
    }

    server {
        listen 443 ssl;
        server_name yourdomain.com;

        # 配置SSL證書和私鑰路徑
        ssl_certificate /path/to/cert.pem;
        ssl_certificate_key /path/to/key.pem;

        # 配置SSL協議和加密套件
        ssl_protocols TLSv1.2 TLSv1.3;  # 啟用TLS協議版本
        ssl_ciphers HIGH:!aNull:!MD5;   # 配置安全的加密套件
        ssl_prefer_server_ciphers on;   # 優先使用伺服器端的加密套件

        location / {
            # 反向代理到後端伺服器
            proxy_pass https://127.0.0.1:5000;
             # 設定代理頭資訊
            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;
        }
    }

修改後檢查配置是否正確: nginx -t
重新載入: nginx -s reload

相關文章