headscale使用自定义证书

Headscale使用自定义证书

在一些嵌入式设备中没有安装根证书,并且更新根证书比较麻烦,此时可以使用长时间的自定义证书。

生成自定义证书(特别是自签名证书)虽然技术上可行,但需要注意安全性和信任问题。自签名证书不会被浏览器或操作系统信任,会导致安全警告。以下是生成30年有效期证书的步骤和注意事项:


1. 生成证书的步骤

使用 OpenSSL 工具生成自签名证书(支持 SAN 扩展,兼容现代浏览器):

步骤 1:安装 OpenSSL

1
2
3
4
5
# Ubuntu/Debian
sudo apt-get install openssl

# CentOS/RHEL
sudo yum install openssl

步骤 2:创建配置文件 openssl.cnf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[ req ]
default_bits = 4096
default_keyfile = example.com.key
distinguished_name = req_distinguished_name
req_extensions = req_ext
x509_extensions = v3_ca
prompt = no

[ req_distinguished_name ]
C = CN # 国家代码
ST = Shanghai # 省份
L = Shanghai # 城市
O = example.com Inc # 组织名称
OU = IT # 组织单位
CN = www.example.com

[ req_ext ]
subjectAltName = @alt_names

[ v3_ca ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = www.example.com
DNS.2 = example.com # 可选:添加其他域名

步骤 3:生成私钥和证书

1
2
openssl req -x509 -new -nodes -keyout example.com.key -sha256 \
-days 10950 -out example.com.crt -config openssl.cnf
  • -days 10950:30年(30×365)
  • 输出文件:example.com.key(私钥)、example.com.crt(证书)

3. 验证证书

1
openssl x509 -in example.com.crt -text -noout

检查有效期(Validity)和域名(Subject Alternative Name)。


4. 部署证书

  • Web 服务器:将 example.com.keyexample.com.crt 配置到 Nginx/Apache。
  • 强制 HTTPS:确保服务器配置了 HTTPS 重定向。

5. 客户端信任证书

Headscale 使用自定义证书时,Tailscale 连接登入会出现如下错误:Received error: fetch control key: Get "https://www.example.com/key?v=116": x509: certificate signed by unknown authority。这是因为Tailscale 客户端默认要求服务器证书由受信任的证书颁发机构(CA)签发,例如 Let’s Encrypt。如果使用自签名证书或非 Let’s Encrypt 的证书,客户端会因无法验证证书链而拒绝连接。

步骤 1:确认证书安装位置

  1. 以管理员身份运行证书管理器

    • Win + R,输入 mmc,回车。
    • 点击 文件 → 添加/删除管理单元
    • 添加 证书 管理单元,选择 计算机账户 → 本地计算机
  2. 检查证书是否已安装到 受信任的根证书颁发机构

    • 在左侧导航栏展开 证书(本地计算机)受信任的根证书颁发机构证书
    • 确认列表中存在 www.example.com 的证书(颁发者和使用者均为 example.com Inc)。
  3. 若未找到证书,重新安装

    • 右键 证书 → 所有任务 → 导入。
    • 使用向导导入 example.com.crt,**在向导最后一步选择存储位置为 受信任的根证书颁发机构**。

注意事项

  1. 证书安装位置错误
    Windows 系统有多个证书存储区(如 受信任的根证书颁发机构本地计算机当前用户)。

    • 必须 将自签名证书安装到 受信任的根证书颁发机构(Trusted Root Certification Authorities)
    • 若安装到其他位置(如 个人证书当前用户 存储),系统级服务(如 Tailscale 客户端)将无法信任该证书。
  2. 证书未正确应用于系统级
    Windows 的证书管理分为 本地计算机当前用户

    • 如果以普通用户身份安装证书,仅当前用户有效,系统服务(如 Tailscale)可能无法访问。
    • 需要以管理员权限运行证书管理工具,将证书安装到 本地计算机受信任的根证书颁发机构
  3. 证书文件内容问题

    • 证书文件可能包含多个证书(如中间证书链),导致解析失败。
    • 证书文件可能不是 PEM 格式(需确保内容以 -----BEGIN CERTIFICATE----- 开头)。