You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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"

生成后需要导出证书和私钥:

  1. 按下Win+R输入mmc打开控制台,点击「文件」→「添加/删除管理单元」,选择「证书」→「添加」,选择「计算机账户」→「本地计算机」完成添加
  2. 在「证书(本地计算机)」→「个人」→「证书」中找到刚生成的、以你的公网IP命名的证书
  3. 右键证书→「所有任务」→「导出」,先导出公钥证书(保存为.cer或.pem格式)
  4. 再次右键导出,选择「是,导出私钥」,保存为.pfx格式(可设置导出密码或留空)
  5. 用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端

  1. 在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>
  1. 把之前生成的cert.pem转成.cer格式(直接改后缀或执行openssl x509 -in cert.pem -out cert.cer -outform DER),放到android/app/src/main/res/raw文件夹(没有则新建)
  2. 修改android/app/src/main/AndroidManifest.xml,在<application>标签内添加:
android:networkSecurityConfig="@xml/network_security_config"

iOS端

  1. 打开Xcode项目,把.cer证书文件拖入项目,勾选「Copy items if needed」和对应的target
  2. 编辑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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 17:34:50