Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

lego 使用记录 #336

Open
Bpazy opened this issue Oct 24, 2024 · 1 comment
Open

lego 使用记录 #336

Bpazy opened this issue Oct 24, 2024 · 1 comment

Comments

@Bpazy
Copy link
Owner

Bpazy commented Oct 24, 2024

类似于 acme.sh, lego 也是用于签发证书的工具,采用 go 语言实现(acme.sh 是用 shell 写的,阅读困难)。

lego 的命令、文档、代码实现都更加清晰明了,推荐使用。

安装直接看官方文档,用包管理器就行: https://go-acme.github.io/lego/installation/index.html

我是 Ubuntu 系统,但是 lego 官方只维护了 snap 包,而 snap 包安装的 lege 只能写 /var/snap/lego/common/.lego 目录,--run-hook 命令指定的 shell 是没有权限把证书复制到其他目录的。

所以我是手动安装的:

# gg 是代理,好用,推荐
gg wget https://github.com/go-acme/lego/releases/download/v4.19.2/lego_v4.19.2_linux_amd64.tar.gz
tar -xzvf lego_v4.19.2_linux_amd64.tar.gz
sudo mv lego /usr/bin/
@Bpazy
Copy link
Owner Author

Bpazy commented Oct 24, 2024

lego 生成证书

sudo ALICLOUD_ACCESS_KEY=123 \  # 设置阿里云的访问密钥ID为123,用于身份验证
ALICLOUD_SECRET_KEY=123 \  # 设置阿里云的密钥为123,与访问密钥ID配合使用进行身份认证
lego --server=https://acme-staging-v02.api.letsencrypt.org/directory \  # 使用lego客户端并指定ACME服务器地址为Let's Encrypt的Staging环境。正式运行时移除改行,这是测试时使用的,防止触发 rate limit
    --path /home/ubuntu/lego/data \  # 设置lego客户端的工作目录路径,用于存储生成的证书等数据
    -a \  # 同意服务条款
    --email [email protected] \  # 设置接收警告和通知的邮箱地址
    --dns alidns \  # 使用阿里云DNS服务进行域名验证
    -d example.host \  # 指定需要为之生成证书的域名
    -d *.example.host \  # 指定需要为之生成证书的域名(此例为通配符证书)
    --http \  # 使用HTTP挑战方式验证域名所有权
    run \  # 执行主操作流程,包括验证和证书申请
    --run-hook /home/ubuntu/lego/hook.sh  # 操作完成后执行的钩子脚本路径

这样执行后会生成名为 example.host.crt 的证书,其中包含了 example.host*.example.host,最终的文件名取决于第一个 -d 命令指定的域名。

然后添加 crontab 任务用于续期:

35 3 * * * sudo ALICLOUD_ACCESS_KEY=123 ALICLOUD_SECRET_KEY=123 lego --path /home/ubuntu/lego/data -a --email [email protected] --dns alidns -d example.host -d *.example.host renew --renew-hook /home/ubuntu/lego/hook.sh

和上面的不同点就是 run 替换为了 renew, --run-hook 替换为 renew-hook

hook.sh 文件主要是为了重启 nginx 加载最新证书:

#!/bin/bash

nginx_cert_dir="/etc/nginx/ssl"

echo $LEGO_CERT_DOMAIN

if [ "$LEGO_CERT_DOMAIN" = "example.host" ]; then
  install "$LEGO_CERT_PATH" "$nginx_cert_dir"
  install "$LEGO_CERT_KEY_PATH" "$nginx_cert_dir"

  systemctl restart nginx
fi

echo over

nginx 配置形如:

server {
    listen 443 ssl;
    server_name grafana.example.host;

    ssl_certificate     /etc/nginx/ssl/example.host.crt;
    ssl_certificate_key /etc/nginx/ssl/example.host.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;


    location / {
        proxy_pass http://10.43.87.148:3000/;
        proxy_set_header Host $http_host;
    }
}

小 tip

按照 Let's Encrypy 协议,生成的证书应该为以下部分:

  • fullchain.pem
  • cert.pem
  • chain.pem
  • privkey.pem

lego 生成的不太一样:

  • $domain.crt is the server certificate (including the CA certificate; equivalent to fullchain.pem)
  • $domain.key it the server certificates' private key and key (= privkey.pem),
  • $domain.issuer.crt is only the CA certificate, and
  • $domain.json contains some meta information.

正常咱们直接用 example.crtexample.key 就可以了。

详情可以看下官方仓库 issue 解释: go-acme/lego#1264 (comment)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant