安全


同时保护两种 API 传输

独立运行的 PMS 与 ADS 都提供 REST 和 gRPC。现在两者共同使用 --insecure、--cert、--key、--client-cert 和 --force-client-cert 配置。证书或信任配置无效时启动失败,安全模式不会降级为明文。

TLS 加密连接并认证服务端。若要强制认证客户端,必须通过 --client-cert 提供客户端 CA,同时设置 --force-client-cert=true。只提供 CA 时,仅在客户端主动发送证书的情况下验证该证书。TLS 本身不决定谁有管理员权限,也不提供 Bearer token 校验。管理、诊断、发现接口需要认证网关或等价的访问控制。--enable-authz 参数不提供内置的端点授权策略。

监听地址与兼容性

服务 默认 REST 地址 默认 gRPC 地址
PMS 0.0.0.0:6733 默认关闭;需设置 --grpc-endpoint
ADS 0.0.0.0:6734 默认关闭;需设置 --grpc-endpoint

REST 与 gRPC 的地址分别配置。仅设置 --endpoint 不会启用 gRPC;请显式使用 --grpc-endpoint 127.0.0.1:50001(PMS)或 127.0.0.1:50002(ADS)。127.0.0.1:0 为隔离测试选择临时端口。需要 IPv6 时显式指定 IPv6 监听地址。

配置优先级为命令行、SPDL_* 环境变量、JSON 配置、默认值。gRPC 对应 --grpc-endpoint、SPDL_GRPC_ENDPOINT 和 serverConfig.grpcEndpoint。API 总览提供当前 proto 契约及客户端生成说明。

生成本地测试证书

先按快速入门编译二进制,然后从仓库根目录使用 Go 1.26.10 或 Go 1.27.3(也可使用同一大版本的更新补丁版本)生成本地 CA、独立的服务端与客户端证书。服务端证书的 SAN 包括 localhost、127.0.0.1、::1,私钥权限为 0600。这些是有效期 24 小时的演示证书,不能作为生产凭据。工具拒绝覆盖已有文件;重新生成时使用新的输出目录。

go run ./website/tests/examples/certificates --out ./tls

启动双向 TLS 服务

先停止两个服务,再初始化新的策略文件;只执行一次:

printf '{}\n' > docs-policies.json

终端一启动 PMS:

./bin/speedle-pms --store-type file --filestore-loc ./docs-policies.json \
  --endpoint 127.0.0.1:6733 --grpc-endpoint 127.0.0.1:50001 \
  --cert ./tls/server.crt --key ./tls/server.key \
  --client-cert ./tls/ca.crt --force-client-cert=true

终端二启动 ADS:

./bin/speedle-ads --store-type file --filestore-loc ./docs-policies.json \
  --endpoint 127.0.0.1:6734 --grpc-endpoint 127.0.0.1:50002 \
  --cert ./tls/server.crt --key ./tls/server.key \
  --client-cert ./tls/ca.crt --force-client-cert=true

两个终端都从同一仓库根目录运行并保持打开。完成后分别按 Ctrl-C 停止。生产证书必须覆盖实际域名/IP,并来自组织信任的 CA。

使用 spctl 和 curl

./bin/spctl --pms-endpoint https://127.0.0.1:6733/policy-mgmt/v1/ \
  --skipverify=false --cacert ./tls/ca.crt --cert ./tls/client.crt --key ./tls/client.key \
  get service --all
curl --fail --silent --show-error --cacert ./tls/ca.crt \
  --cert ./tls/client.crt --key ./tls/client.key \
  https://127.0.0.1:6733/policy-mgmt/v1/service

空存储返回 []。不带客户端证书时 TLS 握手失败。spctl 的 --cacert 用来验证服务器,--cert/--key 提供客户端身份;--client-cert 和 --force-client-cert 是服务端参数。保持 --skipverify=false(默认值)。

gRPC 客户端通道同样需要 CA、与证书匹配的服务端名称、客户端证书与私钥。PMS 的服务名称是 pb.PolicyManager,ADS 是 pb.Evaluator。明文通道无法调用上述 TLS 端点。

本地明文开发

只有显式 --insecure=true 才会为两种传输启用明文。此时 REST/gRPC 都应绑定回环地址。不要公开这些未认证端点,也不要信任非可信调用者填写的主体名或属性。令牌断言服务验证已配置的身份令牌,并不能自动认证每一个 PMS/ADS 调用方或替代端点访问控制。