Youtube视频




相关链接

安装

基础依赖

# socat 是sandalone需要的依赖,如果你不使用该模式,可以不安装
# debian/ubuntu
apt -y install openssl cron socat curl

# centos
yum -y install openssl crontabs socat curl

# alpine
apk --no-cache add -f openssl curl socat

# kali
apt-get -qqy install openssl cron socat curl

安装

# email用于注册Let's Encrypted,请填有效邮箱,避免出现注册失败
curl  https://get.acme.sh | sh -s email=hi@gmail.com

# 刷新bashrc配置文件,使别名立即生效
source ~/.bashrc

常用命令

# 升级并设置自动升级
acme.sh  --upgrade  --auto-upgrade

# 查看版本
acme.sh -v

# 列出所有证书
acme.sh --list

# 查看配置
acme.sh --info

# 查看域名配置,多域名证书填主域名
acme.sh --info -d xxx.com


# 续期
# 运行定时器,续期所有证书,ecc证书后面最好需要添加--ecc
acme.sh --cron

# 续期指定证书,--force 强制刷新,ecc证书后面最好需要添加--ecc
acme.sh --renew -d xxx.com

# 续期所有证书
acme.sh --renew-all

# 移除证书,只是移除自动更新和管理,证书文件不会删除
acme.sh --remove -d example.com --ecc

# 设置默认CA,目前脚本默认为zerossl
acme.sh --set-default-ca --server letsencrypt

安装证书(先颁发证书)

# --key-file为安装密钥文件的路径;
# --fullchain-file为安装证书文件的路径;
# --ca-file为安装CA证书文件的路径
# --reloadcmd 为安装成功后执行的命令,一般执行让证书生效的命令,或者分发证书的脚本等
acme.sh --install-cert -d example.com \
--key-file       /etc/nginx/ssl/example.com.key  \
--fullchain-file /etc/nginx/ssl/example.com.crt \
--ca-file        /etc/nginx/ssl/example.com.ca.crt \
--reloadcmd     "systemctl restart nginx"

CA对比

当前acme.sh默认的CA是ZeroSSL(因为被ZeroSSL收购了)
CAShortName最长天数是否支持ECC域名数量是否支持通配符IPv4IPv6终止日期是否支持国际化域名
Let's Encryptletsencrypt90Yes100YesNoNoNoYes
ZeroSSLzerossl90Yes100YesNoNoYesYes
Googlegoogle90Yes100YesNoNoYesNo
Buypassbuypass180Yes5PaidNoNoNoYes
SSL.comsslcom90Yes2PaidNoNoNoYes

CA配置

ZeroSSL CA

方法1

acme.sh  --register-account --server zerossl -m myemail@gmail.com

方法2

  1. 注册/登录ZeroSSL账号:https://app.zerossl.com/signup
  2. 打开开发者页面,生成EAB凭证:https://app.zerossl.com/developer

也可以通过API获取EAB凭证
apt install jq
curl -s -X POST "https://api.zerossl.com/acme/eab-credentials?access_key=你的API_Key" | jq

  • 注册账号
acme.sh  --register-account  --server zerossl \
        --eab-kid  xxxxxxxxxxxx  \
        --eab-hmac-key  xxxxxxxxx

Let's Encrpyted CA

# 实测这里指定邮箱地址没有用,会直接用安装时候使用的邮箱
# 所以如果你安装的时候指定了一个不合法的邮箱地址,那有可能会注册失败
acme.sh  --register-account --server letsencrypt -m myemail@gmail.com

Google Public CA

  1. 打开Google Cloud Console:https://console.cloud.google.com/projectcreate
  2. 创建项目,也可以使用已有项目
  3. 启动API:https://console.cloud.google.com/apis/library/publicca.googleapis.com
  4. 打开控制台(Cloud Shell)在屏幕右上方
  5. 获取Account Key(注意,生成的凭证是一次性使用的)

    # 设置当前控制台的session为指定的项目,设置成功控制台命令行会高亮显示当前项目的ID
    gcloud config set project <项目ID>
    # 生成凭证,keyId位 eab-id,b64MacKey为eab-hmac-key
    gcloud publicca external-account-keys create
  6. 注册,回到服务器终端

    acme.sh  --register-account --server google  -m myEmail@gmail.com \
     --eab-kid 'xxxxxxxxxxxxxxx' \
     --eab-hmac-key 'xxxxxxxxxxxxx'

颁发证书

Webroot模式

  1. 添加域名解析
  2. 安装启用Nginx(其他web服务器也可以,只是配置不一样)
  3. 配置Nginx

    # 进入到nginx的静态文件目录,创建验证证书的目录
    cd /usr/share/nginx/html
    mkdir -p .well-known/acme-challenge
    # 配置nginx
    server {
     listen 80;
     server_name 自己的域名;
    
     location /.well-known/acme-challenge/ {
     alias /usr/share/nginx/html/.well-known/acme-challenge/;
     }
    }
  4. 颁发

    # --issue为颁发证书命令
    # -d 指定需要签证的域名
    # -w 表示使用webroot模式,并指定webroot的所在目录(acme.sh需要有改目录的权限)
    acme.sh --issue -d 自己的域名 -w /usr/share/nginx/html

Nginx模式

  1. 添加域名解析
  2. 安装启用Nginx
  3. 配置Nginx

    server {
     listen 80;
     server_name 你的域名;
     root /usr/share/nginx/html;
    }
  4. 颁发

    # --nginx表示使用nginx模式,默认会从/etc/nginx/nginx.conf寻找配置文件
    acme.sh  --issue -d 你的域名 --nginx
    # 如果nginx的配置文件不在默认路径,可以在后面指定
    acme.sh  --issue  -d 你的域名  --nginx /other/nginx/nginx.conf

Standalone 独立模式 & 独立模式TLS

  1. 添加域名解析
  2. 安装socat依赖(请查看安装)
  3. 颁发

    # --standalone表示使用独立模式
    # --keylength 表示使用的证书长度,默认是ecc证书,这里2048表示使用rsa证书2048长度;其他颁发模式同样可以指定使用的证书长度
    # 默认使用80端口颁发证书,但是如果端口被占用可以指定--httpport,如果使用80端口,请删除该参数
    acme.sh  --issue  -d 你的域名  --standalone --keylength 2048 --httpport 808
    
    ## --apln表示使用独立模式TLS
    # 默认使用443端口颁发证书,但是如果端口被占用可以指定--tlsport,如果使用443端口,请删除该参数
    acme.sh  --issue  -d 你的域名  --alpn --tlsport 8443

Stateless 无状态模式

  1. 添加域名解析
  2. 获取账号指纹(ACCOUNT_THUMBPRINT)

    # 获取默认CA的账号指纹,如果需要获取其他CA请指定--server
    acme.sh --register-account
  3. 配置Nginx(其他服务器也可以)

    server {
         listen 80;
         server_name 你的域名;
    
         location ~ ^/\.well-known/acme-challenge/([-_a-zA-Z0-9]+)$ {
           default_type text/plain;
           return 200 "$1.你的账号指纹";
         }
    }
  4. 颁发

    # --stateless表示使用无状态模式
    acme.sh --issue -d 你的域名  --stateless

DNS手动模式

太麻烦,不推荐
  1. 预颁发,获取TXT记录

    # --dns表示使用dns模式
    # --yes-I-know-dns-manual-mode-enough-go-ahead-please 手动模式需要该参数
    acme.sh --issue -d 你的域名 --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please
  2. 将TXT记录添加到你的域名解析
  3. 使用续签命令颁发

    # --renew 为续期命令
    acme.sh --renew -d 你的域名 --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please

DNS API模式

  1. 确认域名提供商是否支持API模式,以及配置方式
    https://github.com/acmesh-official/acme.sh/wiki/dnsap
    https://github.com/acmesh-official/acme.sh/wiki/dnsapi2
  2. 下面是Cloudflare的配置,导入相关的参数

    # 请参考视频获取Token等相关参数
    export CF_Token="xxxxxx"
    export CF_Account_ID="xxxxxx"
    export CF_Zone_ID="xxxxxx"
  3. 颁发

    # --dns 表示使用模式,指定需要使用的dns提供商,dns_cf为cloudflare
    # 以下是签发主域名的方式,指定两个-d参数即可,多域证书同理
    acme.sh --issue --dns dns_cf -d example.com -d www.example.com

DNS Alias模式

别名模式请参照视频,适合不支持DNS API模式的域名提供商,或者需要保护域名的安全。可以使用别名模式。

泛域名证书

# 指定两个-d参数,第二个为泛域名
# --dns dns_cf使用dns api模式,域名提供商为Cloudflare
# --server为指定CA机构,也可以使用默认的
acme.sh --issue -d example.com -d *.example.com --dns dns_cf --server google

多域名(SAN)证书

# 可以指定多个-d参数,则为多域名证书,第一个-d参数指定的域名为主域名。可以指定不同的域名
acme.sh --issue -d a.example.com -d b.example.com -d c.other.com --dns dns_cf

混合模式

同为SAN证书,只不过是每个域名使用不同的验证模式
# 第一个域名使用Nginx模式验证;第二个域名使用dns api模式验证
acme.sh --issue -d a.example.com --nginx -d b.example.com --dns dns_cf
如果觉得我的文章对你有用,请随意赞赏