环境:
WSL2
Ubuntu22.04
Flask
问题描述:
如何生成 cert.pem
和 key.pem
文件?
解决方案:
要生成 cert.pem
和 key.pem
文件(SSL/TLS 证书和密钥),可以通过以下几种方式完成,选择适合您的需求的方式:
1. 使用 OpenSSL 生成自签名证书
这是最快速的方法,适用于本地开发和测试,但由于是自签名证书,浏览器和客户端会认为它不安全。
步骤:
-
安装 OpenSSL
- 如果尚未安装 OpenSSL,可以通过以下方式安装:
- Windows:通过 OpenSSL for Windows 下载并安装。
- Linux(大多数发行版自带):
sudo apt update && sudo apt install openssl
- macOS(通过 Homebrew):
brew install openssl
- 如果尚未安装 OpenSSL,可以通过以下方式安装:
-
生成证书和私钥
-
运行以下命令生成自签名证书
cert.pem
和私钥key.pem
:openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout key.pem -out cert.pem
-
参数说明:
-x509
:生成 X.509 格式的证书。-nodes
:不加密私钥(避免输入密码)。-days 365
:证书的有效期为 365 天。-newkey rsa:2048
:生成一个 2048 位的 RSA 密钥。-keyout key.pem
:私钥输出到key.pem
文件。-out cert.pem
:证书输出到cert.pem
文件。
-
-
填写证书信息
-
执行命令时,系统会提示您填写一些信息。例如:
Country Name (2 letter code) [AU]:CN State or Province Name (full name) [Some-State]:Beijing Locality Name (eg, city) []:Beijing Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCompany Organizational Unit Name (eg, section) []:IT Common Name (e.g. server FQDN or YOUR name) []:192.168.168.77 Email Address []:admin@example.com
-
注意:
Common Name (CN)
应填写服务器的域名或 IP 地址,例如192.168.168.77
或localhost
,否则客户端会报错。
-
-
生成成功
- 运行成功后,当前目录下会生成:
key.pem
:私钥文件。cert.pem
:证书文件。
- 运行成功后,当前目录下会生成:
-
测试 Flask 使用自签名证书
- 在 Flask 应用中启用 HTTPS:
from flask import Flask app = Flask(__name__) @app.route('/') def home(): return "Hello, HTTPS!" if __name__ == "__main__": app.run(ssl_context=('cert.pem', 'key.pem')) # 使用生成的证书和私钥
- 在 Flask 应用中启用 HTTPS:
2. 使用 Let’s Encrypt 生成免费证书(推荐用于生产环境)
如果服务器使用公网 IP,可以使用 Let’s Encrypt 提供免费证书。它是一个权威 CA(证书颁发机构),签发的证书会被浏览器和客户端信任。
步骤:
-
安装 Certbot
Certbot 是一个自动化工具,用于生成和安装 Let’s Encrypt 证书。-
Ubuntu/Debian:
sudo apt update sudo apt install certbot python3-certbot-nginx
-
CentOS/RHEL:
sudo yum install certbot python3-certbot-nginx
-
macOS(通过 Homebrew):
brew install certbot
-
-
获取证书
-
如果您使用 Nginx 或 Apache,可以让 Certbot 自动配置 HTTPS:
sudo certbot --nginx
或:
sudo certbot --apache
-
如果您只是获取证书,而不自动配置服务器:
sudo certbot certonly --standalone
-
Certbot 会提示您填写域名、邮箱等信息,并自动生成证书。
-
-
证书存储路径
- 生成的证书默认存储在
/etc/letsencrypt/live/<your-domain>/
目录下:fullchain.pem
:完整的证书链。privkey.pem
:私钥。
- 生成的证书默认存储在
-
使用证书
- 在 Flask 中使用 Let’s Encrypt 证书:
app.run(ssl_context=('/etc/letsencrypt/live/<your-domain>/fullchain.pem', '/etc/letsencrypt/live/<your-domain>/privkey.pem'))
- 在 Flask 中使用 Let’s Encrypt 证书:
-
设置自动续期
- Let’s Encrypt 证书有效期为 90 天,建议设置自动续期:
添加以下任务,每天凌晨尝试续期:sudo crontab -e
0 0 * * * certbot renew --quiet
- Let’s Encrypt 证书有效期为 90 天,建议设置自动续期:
3. 测试环境中忽略 HTTPS 验证(仅开发环境,不推荐)
在开发环境中,您可以强制忽略 HTTPS 验证,避免使用正式证书:
在 Flask 中忽略 HTTPS:
-
使用 Flask 的内置 HTTP 服务器,不配置 SSL:
app.run()
-
在浏览器或客户端中允许访问不安全的 HTTPS:
- Chrome:
- 在浏览器地址栏输入:
chrome://flags/#allow-insecure-localhost
- 启用 “Allow invalid certificates for resources loaded from localhost”。
- 在浏览器地址栏输入:
- Chrome:
4. 总结:选择适合的方式
使用场景 | 方法 |
---|---|
本地开发 | 使用 OpenSSL 生成自签名证书。快速、简单,但客户端会提示不安全。 |
内网环境 | 使用自签名证书,但手动将证书安装到每个客户端的信任列表中。 |
生产环境 | 使用 Let’s Encrypt 生成免费证书,或从权威 CA(如 DigiCert、阿里云、腾讯云)购买正式证书。 |
测试环境(临时) | 在 Flask 或其他框架中直接启用 HTTP,或强制忽略 HTTPS 验证(仅用于开发/测试阶段)。 |
推荐的做法是:
- 本地开发:使用自签名证书。
- 生产环境:使用 Let’s Encrypt 或权威 CA 的证书,确保安全性和兼容性。