跳转到主要内容

证书管理

本页只解释 lynx/conf/boot-example.yml 里归属于 lynx.tlslynx.tls.auto 的配置范围。 当前 boot-example.yml 并没有直接展开这段 TLS 配置,所以需要你自己把这些键补到 lynx: 下面。

TLS 加载器位于 github.com/go-lynx/lynx/tls。它负责加载证书、向应用注册 lynx.CertificateProvider,然后由 HTTP、gRPC 等真正打开 tls_enable 的传输插件消费。

Runtime 事实

项目
Go modulegithub.com/go-lynx/lynx/tls
主配置前缀lynx.tls
自动证书补充键lynx.tls.auto
Runtime 插件名tls
默认来源类型control_plane
传输层联动HTTP / gRPC 还要各自再开 tls_enable: true

配置前先知道

  • source_type: auto 是代码层支持的能力,虽然 protobuf 本身只声明了 control_planelocal_filememory
  • 只有当 lynx.tls.source_typeauto 时,代码才会去读取 lynx.tls.auto
  • 控制面模式下,group 为空会回退到 file_name
  • shared_ca.config_group 为空会回退到 shared_ca.config_name
  • verify_hostnamecipher_suitessession_ticket_key 会被接收和校验,但当前 applyCommonConfig() 还没有把它们真正写进 tls.Config

lynx.tls

字段作用何时生效默认值 / 交互关系常见误配
source_type选择证书来源。一直生效。默认 control_plane;可选 control_planelocal_filememoryauto想用自动证书却忘了把来源切到 auto
file_name指定控制面里的 TLS 配置名。source_type: control_plane控制面模式必填。留空后还以为会自动推导。
group指定控制面分组。source_type: control_plane可选;为空时会使用 file_name分组写错,结果一直在读错的远程配置。
local_file文件证书来源配置块。source_type: local_file本模式必须提供。填了文件块,却把 source_type 留在默认值。
memory内嵌 PEM 内容配置块。source_type: memory本模式必须提供。往这里填文件路径,而不是 PEM 内容。
common证书加载完成后再套一层通用 TLS 策略。任意来源都可用。可选;但并不是块里的每个字段都已经接线到运行时。以为 common 里所有字段都会立即影响实际握手。

lynx.tls.local_file

字段作用何时生效默认值 / 交互关系常见误配
cert_file服务端证书文件路径。local_file 模式必填。校验器会解析绝对路径并检查可读性。相对路径写对了仓库位置,但服务进程工作目录下找不到。
key_file私钥文件路径。local_file 模式必填。校验器会检查可读性。把证书和私钥路径写反。
root_ca_file可选根 CA 文件路径。需要自定义 CA 验证时。可选;有值就会校验。mTLS 场景漏掉 CA,结果对端校验失败。
watch_files是否监听证书文件变化并热重载。local_file 模式。默认 falsememorycontrol_plane 模式里开它,结果当然没有热更新。
reload_interval文件轮询 / 重载间隔。watch_files: true 时。默认 5s;合法范围 1s300s填成过小或过大的值触发校验失败。
cert_format声明磁盘证书格式。local_file 模式。默认 pem;只接受 pemder写成 crtx509 之类代码不认识的字符串。

lynx.tls.memory

字段作用何时生效默认值 / 交互关系常见误配
cert_data直接内嵌证书 PEM 内容。memory 模式必填。无默认值。填成文件路径。
key_data直接内嵌私钥 PEM 内容。memory 模式必填。无默认值。只贴了证书,没贴对应私钥。
root_ca_data直接内嵌根 CA PEM 内容。需要自定义 CA 校验时。可选。自签环境不填它,还希望对端验证通过。

lynx.tls.common

字段作用何时生效默认值 / 交互关系常见误配
auth_type直接映射 Go 的 crypto/tls.ClientAuthTypecommon 存在时。默认 0;合法范围 0..4参考过期注释,以为 Lynx 会重新解释这些值。
verify_hostname声明是否做主机名校验。配置能读到。默认 true,但当前实现还没有把它应用进 tls.Config设成 false 后还期待主机名校验真的关闭。
min_tls_version设置最低 TLS 协议版本。common 存在时。默认 "1.2";支持 1.01.11.21.3写成 TLS1.2 而不是字面值 1.2
cipher_suites预留的密码套件覆盖项。配置能读到。当前会接收,但还没有真正接线到 tls.Config以为改了这里,握手就会立刻换套件。
session_cache_size大于 0 时创建客户端会话缓存。common 存在时。默认 32;合法范围 0..100000 表示不创建缓存对象。0 当成“继续用默认缓存”。
session_ticket_key预留的 session ticket 覆盖项。配置能读到。当前会接收,但还没有真正接线。轮换这个值后期待运行中 ticket 立刻变化。

lynx.tls.auto

代码只有在 lynx.tls.source_type: auto 时才会读取这段。

字段作用何时生效默认值 / 交互关系常见误配
rotation_interval自动生成叶子证书的轮换周期。auto 模式。默认 24h;合法范围 1h168h填了超出范围的分钟级或多天值。
service_name作为 CN / SAN 的服务标识。auto 模式。可选;为空时回退到当前应用标识。多服务测试环境不填,最后证书身份都很模糊。
hostname主机名 SAN 覆盖。auto 模式。可选;为空时回退到 os.Hostname(),再退到 localhost客户端校验的主机名根本没写进 SAN。
sans追加 SAN 列表。auto 模式。可选。忘记把 127.0.0.1 或服务 DNS 名写进去。
cert_validity自动生成叶子证书的有效期。auto 模式。为空时等于 rotation_interval;当前代码并不会强制它必须大于轮换周期,需自行保证合理。有效期比轮换周期还短,导致证书先过期。
shared_ca.from指定共享 CA 来源是文件还是控制面。仅使用 shared_ca 时。shared_ca 出现时必填;可选 filecontrol_plane写了 shared_ca 却没写 from
shared_ca.cert_filefile 模式下的 CA 证书路径。shared_ca.from: file文件模式必填。只配了 CA 证书,没配 CA 私钥。
shared_ca.key_filefile 模式下的 CA 私钥路径。shared_ca.from: file文件模式必填。误填成叶子证书私钥。
shared_ca.config_namecontrol_plane 模式下共享 CA 的配置名。shared_ca.from: control_plane控制面模式必填。误以为会复用 lynx.tls.file_name
shared_ca.config_groupcontrol_plane 模式下共享 CA 的分组。shared_ca.from: control_plane可选;为空回退到 config_name分组填错后一直在读错误的 CA 配置。

完整 YAML 示例

这个示例仍然放在 boot-example.ymllynx: 根下面;这里只展开 TLS 子树。

lynx:
tls:
source_type: "local_file" # control_plane | local_file | memory | auto;默认 control_plane
file_name: "gateway-tls" # source_type=control_plane 时使用的控制面配置名
group: "gateway-tls" # 控制面分组;留空回退到 file_name
local_file:
cert_file: "/etc/ssl/certs/server.crt" # local_file 模式必填
key_file: "/etc/ssl/private/server.key" # local_file 模式必填
root_ca_file: "/etc/ssl/certs/root-ca.pem" # 可选自定义根 CA,用于对端校验
watch_files: true # 仅 local_file 支持热重载;默认 false
reload_interval: "10s" # 本地文件重载检查间隔;默认 5s
cert_format: "pem" # pem 或 der;默认 pem
memory:
cert_data: "-----BEGIN CERTIFICATE-----..." # 仅 memory 模式必填
key_data: "-----BEGIN PRIVATE KEY-----..." # 仅 memory 模式必填
root_ca_data: "-----BEGIN CERTIFICATE-----..." # 可选内嵌 CA 证书
common:
auth_type: 0 # crypto/tls.ClientAuthType 数值,范围 0..4
verify_hostname: true # 会校验但当前还没真正写进 tls.Config
min_tls_version: "1.2" # 默认 1.2;支持 1.0/1.1/1.2/1.3
cipher_suites: "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256" # 能解析,但当前不会真正强制生效
session_cache_size: 32 # 默认 32;0 表示不创建客户端 session cache
session_ticket_key: "00112233445566778899aabbccddeeff" # 当前会接收,但不会真正应用
auto:
rotation_interval: "24h" # 仅 source_type=auto 时使用;默认 24h
service_name: "user-service" # 应用名不够用时的证书身份
hostname: "user-service.internal" # 可选主 SAN 主机名
sans:
- "localhost" # 额外 DNS / IP SAN
- "127.0.0.1"
cert_validity: "48h" # 留空回退到 rotation_interval;应保证 >= 轮换周期
shared_ca:
from: "file" # file 或 control_plane
cert_file: "/etc/ssl/certs/shared-ca.crt" # from=file 时必填
key_file: "/etc/ssl/private/shared-ca.key" # from=file 时必填
config_name: "shared-ca" # from=control_plane 时必填
config_group: "shared-ca" # 可选;留空回退到 config_name

最小可用 YAML 示例

lynx:
tls:
source_type: "local_file" # 最容易直接落地的模式
local_file:
cert_file: "/etc/ssl/certs/server.crt" # 必填服务端证书
key_file: "/etc/ssl/private/server.key" # 必填配套私钥

TLS 加载成功后,HTTP / gRPC 仍要各自再开 tls_enable: true