侧边栏壁纸
博主头像
彼豆博主等级

行动起来,活在当下

  • 累计撰写 14 篇文章
  • 累计创建 17 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录
ssl

acme.sh免费获取ssl泛域名证书并实现证书自动续费

彼豆
2024-03-11 / 0 评论 / 0 点赞 / 44 阅读 / 3711 字

acme.sh 实现了acme协议,可以从ZeroSSL、Let's Encrypt 免费生成ssl证书。本文采用Let's Encrypt生成证书。
acme.sh: https://github.com/acmesh-official/acme.sh
ZeroSSL: https://zerossl.com/
Let's Encrypt: https://github.com/acmesh-official/acme.sh.git

Let's Encrypt和ZeroSSL是证书颁发机构,为HTTPS连接提供完全免费的SSL/TLS证书。Let's Encrypt比ZeroSSL更常见,但它的功能有限。ZeroSSL有多个免费/付费版本。两者生成的免费版证书都只有3个月的有效。
ZeroSSL和Let's Encrypt对比可以查看这篇文章:https://technocript.com/zerossl-vs-lets-encrypt/

acme.sh 安装

curl https://get.acme.sh | sh 
alias acme.sh=~/.acme.sh/acme.sh  # 创建别名,在其他地方可以直接使用
acme.sh -v # 查看版本
https://github.com/acmesh-official/acme.sh
v3.0.8

acme.sh --help  # 查看命令和帮助

acme.sh脚本会安装在主目录 ($HOME): ~/.acme.sh/所有证书也将放在此文件夹中,2.0版本前默认采用Let's Encrypt作为证书服务商,3.0后默认采用ZeroSSL

ssl证书生成

签发 SSL 证书需要证明这个域名是属于你的,即域名所有权,一般有两种方式验证:http 和 DNS验证。

  • http方式:acme.sh 会自动在你的网站根目录下放置一个文件,来验证你的域名所有权,最后会自动删除验证文件。
  • DNS方式:会在域名解析上增加一条txt解析,验证域名所有权。

本文采用DNS和DNS API的方式进行。此方式会调用域名服务商(我的是阿里)的API接口,生成时自动增加一条txt解析,生成完后自动删除。

设置API key

获取阿里云app_key 和 app_secret,阿里云key生成文档参考:https://help.aliyun.com/zh/ram/user-guide/ram-user-management
设置的key信息会保存在~/.acme.sh/account.conf文件中

export Ali_key = "xxxxxxxxx"
export Ali_Secret="xxxxxxx"

生成证书

acme.sh --issue --dns dns_ali -d bbdou.top -d *.bbdou.top --server letsencrypt
  • issue: 生成证书
  • dns: 指定dns服务商为 阿里云
  • d: 指定域名,*.bbdou.top为泛域名
  • server: 指定证书生成机构为Let's Encrypt

生成的证书保存在~/.acme.sh/目录

acme.sh --list # 查看当前证书列表
Main_Domain  KeyLength  SAN_Domains  CA               Created               Renew
bbdou.top    "ec-256"   *.bbdou.top  LetsEncrypt.org  20XX-XX-XXT01:59:47Z  20XX-XX-21T01:59:47Z

Nginx

生成指定证书生成路径,当证书有续期后自动更新服务。

acme.sh --installcert -d  bbdou.top -d *.bbdou.top --server letsencrypt --key-file   /data/docker/nginx/ssl/bbdou.top/bbdou.top.key --fullchain-file /data/docker/nginx/ssl/bbdou.top/fullchain.cer --reloadcmd  "docker exec nginx nginx -s reload"

crontab -l  # 查看系统定时任务,已经能看到acme.sh的定时任务
59 2 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
  • installcert: 安装
  • key-file: key文件路径
  • fullchain-file :fullchain路径
  • reloadcmd: 当证书有更新时执行的命令(因为我的服务安装在docker里的)

Nginx配置参考

server {
    listen 80;
    listen [::]:80;
    server_name bbdou.top;
    
    # 禁止通过 IP 直接访问
    if ($host ~ ^\d+\.\d+\.\d+\.\d+$) {
        return 444;
    }
    # 重定向到 https
    return 301 https://$host$request_uri;
}
 
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name bbdou.top;

    ssl_certificate "/etc/nginx/ssl/bbdou.top/fullchain.cer";
    ssl_certificate_key "/etc/nginx/ssl/bbdou.top/bbdou.top.key";
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  10m;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # 禁止通过 IP 直接访问
    if ($host ~ ^\d+\.\d+\.\d+\.\d+$) {
        return 444;
    }

    location / {
  ...访问配置
    } 
}
0

评论区