eclipse/che-jwtproxyJWT Proxy 是一款用于服务间请求认证与授权的互补性服务,旨在保障分布式系统中服务间通信的安全性。该镜像包含两个核心组件:
用于使用私钥对出站请求进行JWT签名,核心特性包括:
Authorization 请求头,包含请求源服务标识、目标服务标识等JWT声明。潜在特性(规划中):
限制:
CONNECT 隧道机制仅支持转发HTTPS请求(默认客户端均使用 CONNECT 处理HTTPS请求,完全兼容)。用于验证由正向代理签署的入站请求,核心特性包括:
Authorization JWT头。通过配置文件启动JWT Proxy:
bashjwtproxy -config config.yaml
配置文件以 jwtproxy 为顶层键,通过 signer_proxy 启用正向代理,通过 verifier_proxies 启用一个或多个反向代理。基本结构如下:
yamljwtproxy: # 正向代理配置(可选,存在则启用正向代理) signer_proxy: <Signer Config> # 反向代理配置(可选,存在则启用反向代理,支持多实例) verifier_proxies: - <Verifier Config> - <Verifier Config>
用于配置JWT正向代理,示例及参数说明如下:
yamljwtproxy: signer_proxy: enabled: <bool> # 是否启用,默认true listen_addr: <string> # 代理绑定地址,默认":8080" shutdown_timeout: <time.Duration> # 关闭超时,默认"1m" # MITM SSL配置(可选,用于签署HTTPS请求) ca_key_file: <path> # CA私钥文件路径(必填,否则HTTPS请求将被拒绝) ca_crt_file: <path> # CA证书文件路径(必填,否则HTTPS请求将被拒绝) trusted_certificates: <[]string> # 信任的证书列表,默认使用系统根证书 insecure_skip_verify: <bool> # 是否跳过远程服务证书验证,默认false signer: issuer: <string> # 签发者标识(必填,如服务名称) expiration_time: <time.Duration> # JWT有效期,默认"5m" max_skew: <time.Duration> # 允许的时间偏差,默认"1m" nonce_length: <int> # 随机数长度,默认32 # 私钥配置(必填,支持自动生成或预共享) private_key: type: <string> # 私钥类型:"autogenerated"(自动生成)或"preshared"(预共享) options: <map[string]interface{}> # 对应类型的配置选项
私钥配置示例:
自动生成私钥(自动生成密钥对并发布公钥至密钥服务器):
yamlprivate_key: type: autogenerated options: rotate_every: <time.Duration> # 密钥轮换周期,默认"12h" key_folder: <string> # 密钥存储目录,默认"~/.config/jwtproxy/" key_server: # 密钥服务器配置(需符合密钥注册中心规范) type: keyregistry options: registry: <string> # 密钥服务器基础URL(必填)
预共享私钥(使用指定的私钥文件):
yamlprivate_key: type: preshared options: key_id: <string> # 密钥唯一标识(必填) private_key_path: <path> # PEM格式私钥文件路径(必填)
用于配置JWT反向代理,示例及参数说明如下:
yamljwtproxy: verifier_proxies: - enabled: <bool> # 是否启用,默认true listen_addr: <string> # 绑定地址(支持HTTP/HTTPS URL或UNIX socket,格式"unix:/path"),默认":8081" shutdown_timeout: <time.Duration> # 关闭超时,默认"1m" # SSL终止配置(可选,启用HTTPS时必填) key_file: <path> # PEM格式私钥文件路径 crt_file: <path> # PEM格式证书文件路径 verifier: upstream: <string> # 上游服务地址(支持HTTP/HTTPS URL或UNIX socket),必填 audience: <string> # JWT受众声明(aud)的预期值(如服务URL),必填 max_skew: <time.Duration> # 允许的时间偏差,默认"1m" max_ttl: <time.Duration> # JWT最大生存时间,默认"5m" excludes: <[]string> # 无需认证的路径列表(如"/healthz"),默认nil auth_redirect_url: <string> # 未认证请求重定向URL,默认返回403 cookies_enabled: <bool> # 是否从"access_token" cookie提取JWT,默认false # 公钥获取配置(必填) key_server: type: <string> # 密钥服务器类型:"keyregistry"(密钥注册中心)或"preshared"(预共享,测试用) options: <map[string]interface{}> # 对应类型的配置选项 # 随机数(nonce)存储配置(必填) nonce_storage: type: <string> # 存储类型:"local"(内存缓存)或"void"(不验证) options: <map[string]interface{}> # 对应类型的配置选项
密钥服务器配置示例:
密钥注册中心(从密钥服务器动态获取公钥):
yamlkey_server: type: keyregistry options: registry: <string> # 密钥服务器基础URL,必填 cache: # 缓存配置(可选) duration: <time.Duration> # 缓存有效期,默认"10m" purge_interval: <time.Duration> # 缓存清理间隔,默认"1m"
预共享密钥服务器(测试用,仅支持单个公钥):
yamlkey_server: type: preshared options: issuer: <string> # 允许的签发者标识,必填 key_id: <string> # 密钥唯一标识,必填 public_key_path: <path> # PEM格式公钥文件路径,必填
随机数存储配置示例:
本地内存缓存(存储并验证nonce,防止重放***):
yamlnonce_storage: type: local options: purge_interval: <time.Duration> # 缓存清理间隔,默认0(即时清理)
空存储(不验证nonce,适用于无需严格唯一性校验场景):
yamlnonce_storage: type: void
正向代理签署HTTPS请求时需作为中间人(MITM),需生成CA证书和私钥以伪造目标服务器证书。若未指定,代理将拒绝转发HTTPS请求。
生成有效期1年的CA证书和私钥(无密码):
bashopenssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ca.key -out ca.crt
ca.crt:CA证书,需分发给所有通过正向代理发起请求的客户端并信任。ca.key:CA私钥,需保密,通过 ca_key_file 和 ca_crt_file 配置到正向代理。反向代理启用SSL终止时,需提供服务端证书和私钥(可自签名或由CA签发)。
生成自签名密钥对(有效期1年):
bashopenssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout reverseProxy.key -out reverseProxy.crt
Common Name 与反向代理的访问域名一致。key_file 和 crt_file 配置到反向代理。bashdocker build -t jwtproxy .
将本地配置文件挂载至容器,指定配置启动:
bashdocker run -it -v /path/to/local/config:/config jwtproxy -config /config/config.yaml
/path/to/local/config:本地存放 config.yaml、CA证书、密钥等文件的目录。创建 docker-compose.yml:
yamlversion: "3" services: jwtproxy: build: . volumes: - ./config:/config # 挂载本地配置目录 ports: - "8080:8080" # 正向代理端口(若启用) - "8081:8081" # 反向代理端口(若启用) command: -config /config/config.yaml
启动服务:
bashdocker-compose up -d
运行项目测试用例:
bashgo test ./...
bashgo build -o jwtproxy cmd/jwtproxy/main.go
运行二进制:
bash./jwtproxy -config config.yaml
manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务