407 的定位
407 Proxy Authentication Required 表示请求必须先通过代理认证。响应里由代理给出 Proxy-Authenticate 挑战,客户端用 Proxy-Authorization 头携带凭证重试(RFC 9110 §15.5.8)。它和 401 的关键差别是归属:401 来自源站,407 来自代理这一跳,与目标站点本身无关。
基本信息
| 名称 | 407 Proxy Authentication Required |
|---|---|
| 出现位置 | 代理 → 客户端 这一跳 |
| 挑战头 | Proxy-Authenticate |
| 应答头 | Proxy-Authorization |
| 规范 | RFC 9110 §15.5.8、§11.7 |
典型使用场景
- 企业出口代理要求账号口令,浏览器与命令行工具都要配凭证
- 调试拦截代理开启认证后,抓包请求开始大面积 407
- 多级代理嵌套:判断到底是哪一跳在要求认证
- CI 容器构建失败排查:容器内没继承宿主机的代理凭证
携带代理认证
携带代理认证
curl -si -x http://proxy.corp:3128 -U user:pass https://example.com/ # -U 传代理凭证
curl -si -v https://example.com/ # -v 能看到 CONNECT 与 407 应答
nc -v proxy.corp 3128 # 先确认代理端口本身可达与 401 的区别
| 对比项 | 401 | 407 |
|---|---|---|
| 归属 | 源站资源 | 代理这一跳 |
| 挑战头 | WWW-Authenticate | Proxy-Authenticate |
| 应答头 | Authorization | Proxy-Authorization |
| 用户侧表现 | 站点登录框 | 系统或代理凭证提示 |
出现 407 先确认请求确实经过了代理:检查 http_proxy/https_proxy 环境变量、系统代理设置、容器与构建工具各自的代理配置,再看凭证是否过期。
认证为何在这一层
代理认证的意义是把出口收口做身份、审计与限速:企业要求每个使用者在出网前先证明身份,因此 407 绝大多数出现在「本机到企业代理」这一段,公网服务与个人网络里几乎见不到。它也是排查「只有某台机器上不去网」时的重要线索。
凭证配在哪里
| 使用方 | 配置位置 | 备注 |
|---|---|---|
| 浏览器 | 系统代理设置或浏览器独立代理设置 | 保存后由系统凭证库托管 |
| curl 与 wget | 命令行的 -U 参数、.netrc、环境变量 | 环境变量最容易被忽略 |
| Docker 构建 | 用户级 config.json 或构建参数 | 容器内不继承宿主机变量 |
| CI 流水线 | 流水线凭据变量加脚本参数 | 注意别把口令打进构建日志 |
命令行凭证写法
命令行凭证写法
# .netrc(权限需为 600)可为 curl 自动提供代理凭证
machine proxy.corp login user password pass
# 环境变量方式,注意别写进共享脚本或仓库
export https_proxy=http://proxy.corp:3128
export no_proxy=localhost,127.0.0.1,.internal代理认证失败常表现为「端口能连通、但所有请求都 407」:先看应答里的 Proxy-Authenticate 字段判断认证体系(Basic、NTLM、Kerberos 的处理方式完全不同),再决定工具怎么配。