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

使用FastAPI通过HTTPS部署本地服务遇混合内容等问题求助

解决方案

1. 强制Uvicorn仅监听HTTPS端口

彻底关闭HTTP端口,确保后端只接受加密请求:

# 启动Uvicorn时直接绑定标准HTTPS端口443并指定SSL证书
uvicorn main:app --host 0.0.0.0 --port 443 --ssl-keyfile ./private-key.pem --ssl-certfile ./certificate.pem

如果之前开启过80端口(HTTP),用防火墙规则封禁该端口,避免意外的明文访问。

2. 修正前端请求路径(根治混合内容问题)

不要依赖upgrade-insecure-requests的自动升级,直接从代码层面清除HTTP引用:

  • 把所有硬编码的绝对HTTP请求(如http://127.0.0.1/api/login)改成相对路径(如/api/login),浏览器会自动沿用当前页面的HTTPS协议发起请求。
  • 检查所有静态资源(CSS、JS、图片)的引用,确保使用相对路径或HTTPS绝对路径,彻底删除任何http://开头的链接。

3. 用本地Hosts映射替代私有DNS(简单高效)

不需要搭建私有DNS,在你用来访问的客户端设备(通过VPN连接的电脑/手机)的Hosts文件里添加域名映射,解决IP访问的证书兼容性问题:

操作步骤:

  1. 编辑客户端Hosts文件:
    • Linux/macOS:sudo nano /etc/hosts
    • Windows:以管理员权限打开记事本,编辑C:\Windows\System32\drivers\etc\hosts
  2. 添加一行映射,绑定VPN内网IP和自定义域名:
    10.8.0.5  myweb.local  # 替换为你的主机VPN内网IP和自定义域名
    
  3. 重新生成包含该域名的自签名证书:
    openssl req -x509 -newkey rsa:4096 -keyout new-key.pem -out new-cert.pem -days 365 -nodes \
      -subj "/CN=myweb.local" \
      -addext "subjectAltName=IP:127.0.0.1,IP:10.8.0.5,DNS:myweb.local"
    
    替换命令中的IP和域名为实际值,确保覆盖主机回环IP、VPN内网IP和自定义域名。
  4. 重启Uvicorn使用新证书,之后用https://myweb.local访问服务。

4. 验证加密传输有效性

无需纠结HTTP/1.1协议版本——HTTPS是HTTP over TLS,只要是HTTPS请求,无论用HTTP/1.1还是HTTP/2,数据都是加密的。你可以通过以下方式验证:

  • 用curl测试加密连接:
    curl -v https://myweb.local/api/login
    
    查看输出中是否包含* SSL connection using TLSv1.3 / ...字样,确认已建立加密链路。
  • 抓包验证:用Wireshark监听VPN接口,检查所有往来流量是否为TLS加密包(无明文HTTP内容)。

5. 额外加固措施

  • 在后端添加Strict-Transport-Security响应头,强制浏览器后续仅用HTTPS访问:
    在FastAPI/Starlette中可通过中间件实现:
    from fastapi import FastAPI
    from starlette.middleware.base import BaseHTTPMiddleware
    
    app = FastAPI()
    
    class HSTSMiddleware(BaseHTTPMiddleware):
        async def dispatch(self, request, call_next):
            response = await call_next(request)
            response.headers["Strict-Transport-Security"] = "max-age=31536000; includeSubDomains"
            return response
    
    app.add_middleware(HSTSMiddleware)
    
  • 登录接口使用POST方法,敏感数据(用户名、密码)放在请求体中,不要通过URL参数传输。

内容的提问来源于stack exchange,提问作者HBL44

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 04:22:11