返回教程列表

配置 TLS 證書(Let's Encrypt)

配置自動 TLS 證書籤發與續簽。

隧道始终加密。[server.enc] 里的 tls 决定证书从哪来:acme、file 或 self_signed。安装脚本默认是自签证书。服务器只有 IP、没有域名时,这就是正确的默认值。

Let's Encrypt(ACME)

申请走 HTTP-01。除非设置了 acme_challenge_port,否则挑战监听在 80 端口。域名必须解析到这台机器。IP 或 localhost 不能申请;服务端会打日志并继续用自签证书。

toml
[server.enc]
tls = "acme"
domain = "relay.example.com"
contact = "mailto:admin@example.com"
cache_dir = "/var/lib/hash-relay/certs"
frame_encrypt_alg = 0
# acme_challenge_port = 8080   # if something else owns port 80
# acme_staging = true          # test only; do not use in production

续签是自动的:进程经常检查,剩余寿命不超过 30 天、或不超过有效期的三分之一(取更短的那个)时就续签。续签失败会保留仍然有效的旧证书。账号状态存在缓存目录的 acme-account.json。

80 端口被占用时,把 acme_challenge_port 设成高位端口,并把 /.well-known/acme-challenge/ 反代过去。server.toml 示例里有 Nginx 和 Caddy 的写法。

使用已有证书

toml
[server.enc]
tls = "file"
cert_path = "/etc/hash-relay/certs/fullchain.pem"
key_path = "/etc/hash-relay/certs/privkey.pem"

文件证书在文件变化时会重新加载(Caddy 或 certbot 续签之后),中间有短暂等待,避免证书和私钥还没写完就被读走。hashrelay 用户必须能读这些文件。

没有域名

保持 tls = "self_signed"。首次启动时服务端日志里有 pin_sha256。把这个值写到客户端 [client.enc] 的 pin_sha256。insecure = true 会跳过校验,只适合实验环境。