如何为Uvicorn部署的Django应用添加HTTPS?(无域名仅公网IP)
仅用公网IP为Django+Uvicorn后端配置HTTPS的方案
因为没有域名,没法用Let's Encrypt这类依赖域名的免费SSL证书,只能通过自签名证书来实现HTTPS,下面是具体操作步骤:
1. 生成自签名SSL证书
方法一:用OpenSSL生成(推荐)
如果你的Windows虚拟机还没装OpenSSL,可以从官方渠道下载,或者通过Chocolatey包管理器安装。装好后执行以下命令,把你的公网IP替换成实际的IP地址:
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes -subj "/CN=你的公网IP"
-days 365:设置证书有效期为1年,可按需调整时长-nodes:生成不加密的私钥,避免每次启动服务器都要输入密码- 执行完成后,当前目录会生成
key.pem(私钥文件)和cert.pem(证书文件)
方法二:用PowerShell生成(Windows自带)
Windows 10/11自带的PowerShell可直接生成证书:
New-SelfSignedCertificate -DnsName "你的公网IP" -CertStoreLocation "Cert:\LocalMachine\My"
生成后需要导出证书和私钥:
- 按下Win+R输入
mmc打开控制台,点击「文件」→「添加/删除管理单元」,选择「证书」→「添加」,选择「计算机账户」→「本地计算机」完成添加 - 在「证书(本地计算机)」→「个人」→「证书」中找到刚生成的、以你的公网IP命名的证书
- 右键证书→「所有任务」→「导出」,先导出公钥证书(保存为
.cer或.pem格式) - 再次右键导出,选择「是,导出私钥」,保存为
.pfx格式(可设置导出密码或留空) - 用OpenSSL把
.pfx转成Uvicorn兼容的PEM格式:
openssl pkcs12 -in cert.pfx -nocerts -out key.pem -nodes openssl pkcs12 -in cert.pfx -clcerts -nokeys -out cert.pem
2. 配置Uvicorn启动HTTPS服务
将原来的启动命令替换为带SSL证书和私钥的版本:
uvicorn backend.asgi:application --host 0.0.0.0 --port 443 --ssl-keyfile ./key.pem --ssl-certfile ./cert.pem
- 标准HTTPS端口是443,若不想用默认端口,也可指定自定义端口(比如8000),但要确保虚拟机防火墙和公网路由器都开放该端口
- 注意把
./key.pem和./cert.pem替换为证书文件的实际存储路径
3. React Native端适配(解决证书不信任问题)
自签名证书默认不被React Native信任,需在客户端做如下配置:
Android端
- 在
android/app/src/main/res下新建xml文件夹,创建network_security_config.xml文件:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="false"> <domain includeSubdomains="true">你的公网IP</domain> <trust-anchors> <certificates src="@raw/cert"/> </trust-anchors> </domain-config> </network-security-config>
- 把之前生成的
cert.pem转成.cer格式(直接改后缀或执行openssl x509 -in cert.pem -out cert.cer -outform DER),放到android/app/src/main/res/raw文件夹(没有则新建) - 修改
android/app/src/main/AndroidManifest.xml,在<application>标签内添加:
android:networkSecurityConfig="@xml/network_security_config"
iOS端
- 打开Xcode项目,把
.cer证书文件拖入项目,勾选「Copy items if needed」和对应的target - 编辑
Info.plist,添加以下配置:
<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>你的公网IP</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <false/> <key>NSTemporaryExceptionMinimumTLSVersion</key> <string>TLSv1.2</string> </dict> </dict> </dict>
调试阶段也可临时允许所有连接(不建议上线使用):
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
关键注意事项
- 自签名证书仅适合开发或内部测试场景,生产环境必须使用受信任CA颁发的证书(需绑定域名)
- 确保虚拟机防火墙允许对应HTTPS端口的入站连接,同时公网路由器做好端口转发(将公网IP的443端口转发到虚拟机的对应端口)
- 使用自定义端口时,React Native请求需带上端口号,比如
https://xxx.xxx.xxx.xxx:8000/api/xxx
内容的提问来源于stack exchange,提问作者Ganesh Mohane
相关产品推荐
相关产品推荐

