LND 的 tls.cert 从哪来:自签证书、24 小时临时证书与补域名的开关 图 1
LND 的 tls.cert 从哪来:自签证书、24 小时临时证书与补域名的开关 · 图 1

LND 对外提供 gRPC 接口,lncli 和第三方应用都通过它操作节点。这条通道默认是加密的,用的是一份节点自己签发的证书——放在 LND 数据目录根部的 tls.cert,配套的私钥是 tls.key。它和比特币核心那种没有 TLS 的 RPC 是两套故事:LND 从一开始就把传输加密做进了 gRPC 层。本文按 LND v0.19.0-beta 源码核对这份证书从生成到刷新的完整生命周期。

一、证书是谁、什么时候生成的

节点首次启动时,如果数据目录里还没有 tls.cert,LND 会自动创建一份自签证书:生成一对密钥,把自己签发的证书写入 tls.cert,私钥写入 tls.key。两个文件在配置里的默认路径就是 LND 目录下的同名文件(源码常量 defaultTLSCertFilename 与 defaultTLSKeyFilename),也可以显式指到别处。自签的意思是没有任何权威机构背书,证书里写的身份是节点自己的主机名和本机网卡地址。这决定了它的信任模型:证书保证的是通道不被中间人窃听,而不是对方身份的权威认证——第一次连接 lncli 时被问是否信任这份证书,问的就是这件事。

二、24 小时临时证书与 tls.cert 的关系

当你在配置里开启了对 LND 自身私钥的加密(encryptkey 一族选项)时,明文形态的长期证书不再常驻磁盘,LND 改用一个有效期 24 小时的临时证书对外服务(源码 tls_manager.go 里的 validityHours 常量)。临时证书每次由程序自动轮换,tls.cert 文件本身作为回退保留。这里有个运维上容易踩的坑:如果你的客户端把证书指纹做了固定校验,而节点开启了自动刷新,指纹就会随临时证书轮换变化。源码为此提供了 tlsautorefresh 一类的显式开关,决定临时证书到期时是静默换新还是停下来等你处理。理解”长期证书在文件里、临时证书在内存里”这个双层结构,排查客户端报出的证书不匹配才不会一头雾水。

三、域名和网卡地址是怎么填进证书里的

默认生成的证书会把节点主机的网卡 IP 和系统主机名一并写进去,这样本机通过 localhost 或主机名连接都能通过校验。配置里有两个方向相反的修饰开关:tlsextradomain 可以往证书里追加域名,适合你把节点放在反代或自定义域名后面的场景;tlsdisableautofill 则相反——不再把网卡地址和主机名塞进证书,改用你指定的第一个额外域名作为证书主体(Common Name)。对端口暴露在内网之外、又不想证书里泄露本机网卡信息的部署,后者是收紧指纹的选择。两条都属于”证书内容随配置变”的例子:证书不是出厂烧死的,而是启动时按当前配置组装的。

四、这份证书保护什么、保护不了什么

先说保护:只要 gRPC 端口没有被别人监听劫持,tls.cert 保证的是传输层的机密性与完整性,macaroon 令牌在通道里不会被顺路偷看。再说边界:自签证书的信任是”第一次见你算你”,跨网络首次连接理想的做法是带外核对指纹——比对双方各自在自己机器上跑出来的 SHA256 摘要,而不是在聊天里互相报一遍。证书只覆盖 gRPC 这条通道,macaroon 的权限控制、监听地址的暴露面是另外两层防线,三层各管各的。把 gRPC 端口直接对公网敞开,等于要求每个连接方都完成了那步带外核对,实践中应该用防火墙、反向代理或洋葱服务收窄。

五、迁移与换机时的证书处理

把节点迁到新机器时,数据目录整体搬迁后 tls.cert 与 tls.key 会随目录一起走,客户端侧需要重新信任一次新指纹——因为证书里的网卡地址与主机名是按新机器的网卡重新生成的。只搬钱包种子不搬证书的情况更常见,此时旧客户端会直接报证书校验失败,处理动作不是把旧 tls.cert 复制回去硬撑,而是按新机器的配置重新生成、重新带外核对指纹。证书本身不包含任何资金信息,删掉它最坏的后果只是所有客户端需要重新握手,把它当作敏感文件过度保护反而会给备份添乱;真正需要保密的始终是数据目录里的后端私钥文件,而不是这份人人都该核对的公钥。

本文所有行为按 LND v0.19.0-beta 源码核对,升级版本后证书处理逻辑可能调整,以对应版本源码与官方文档为准。文中内容仅为技术说明,不构成任何投资建议。

LND 的 tls.cert 从哪来:自签证书、24 小时临时证书与补域名的开关 图 2
LND 的 tls.cert 从哪来:自签证书、24 小时临时证书与补域名的开关 · 图 2