nginx 不加密 api 密钥,而是通过 map、auth_request 或 openresty+lua 实现前置校验与访问控制;推荐对接专用鉴权服务或使用 lua 动态验签防重放,并强制 https、日志脱敏等安全加固。

API 密钥本身不应在 Nginx 中“加密”,而应通过 Nginx 实现安全校验与访问控制——即验证请求携带的有效密钥,同时防止密钥泄露、重放或未授权调用。Nginx 本身不提供密钥加解密能力,但可结合变量、map、auth_request 或 Lua 模块(如 OpenResty)完成密钥校验逻辑。核心思路是:将密钥校验前置到 Nginx 层,避免无效请求到达后端服务。
使用 map 模块做静态密钥白名单校验
适用于密钥数量少、变动不频繁的场景。Nginx 启动时加载密钥映射,匹配成功则设为合法用户标识,后续用作条件路由或限流依据。
示例配置:
# 在 http 块中定义密钥映射(明文密钥仅存于配置文件,需严格限制文件权限)
map $http_x_api_key $api_user {
default "";
"sk_live_abc123" "user_a";
"sk_test_xyz789" "user_b";
}
<p>server {
listen 80;
location /api/ {</p><h1>拒绝缺失密钥的请求</h1><pre class="brush:php;toolbar:false;"> if ($api_user = "") {
return 401 "Invalid or missing API key";
}
# 可选:记录调用方身份(用于日志或后续模块)
proxy_set_header X-Api-User $api_user;
proxy_pass http://backend;
}}
⚠️ 注意:密钥明文写在配置里,必须确保 nginx.conf 文件权限为 600,且由 root 管理;生产环境不建议长期使用此方式。
通过 auth_request 模块对接校验服务
更安全的做法是将密钥校验逻辑交给专用服务(如 Python/Go 编写的鉴权微服务),Nginx 仅作代理和决策转发。Nginx 将请求头中的 X-API-Key 转发给校验服务,根据其返回状态码(200 表示合法)决定是否放行。
配置要点:
- 启用 auth_request 指令,指向内部鉴权 location
- 该 location 使用 proxy_pass 转发到鉴权服务,并透传原始请求头
- 鉴权服务需返回 200(含可选用户信息)或 401/403
location = /auth {
internal;
proxy_pass https://auth-service/validate;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-API-Key $http_x_api_key;
proxy_set_header X-Real-IP $remote_addr;
}
<p>location /api/ {
auth_request /auth;
auth_request_set $auth_user $upstream_http_x_auth_user; # 获取鉴权服务返回的用户标识</p><pre class="brush:php;toolbar:false;">proxy_set_header X-Auth-User $auth_user;
proxy_pass http://backend;}
使用 OpenResty + Lua 动态校验(支持哈希比对与防重放)
若需更高安全性(如密钥不以明文传输、支持时间戳+签名防重放),推荐基于 OpenResty 的 Lua 脚本实现。可对客户端传入的签名字段进行 HMAC 校验,或查 Redis 验证时效性密钥。
典型流程:
- 客户端发送 X-API-Key(实际为 token ID)和 X-Signature(HMAC-SHA256(time+path+body, secret))
- Nginx Lua 脚本提取时间戳,拒绝超过 30 秒的请求
- 根据 key ID 查询后端(如 Redis)获取对应密钥 secret
- 本地重算 signature 并比对,一致则 ngx.var.auth_user = user_id,继续转发
优势:密钥 secret 不暴露在 Nginx 配置中,支持动态增删、自动过期、细粒度限流绑定。
配套安全加固建议
无论采用哪种方式,都需同步落实以下措施:
- 强制 HTTPS:防止密钥在传输中被窃听(使用 let's encrypt 免费证书)
- 限制请求头来源:用 underscores_in_headers on 允许下划线,并用 map 或 if 过滤非法 header
- 隐藏响应敏感信息:禁用 server_tokens,自定义 401/403 错误页,避免泄露 Nginx 或后端版本
- 日志脱敏:在 log_format 中过滤 $http_x_api_key,改用 $api_user 记录已识别身份
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











