acme.sh 介绍
acme.sh 是一个 Unix shell script 实现 ACME client 协议。github 地址是:github.com/acmesh-offi… ,使用它可以申请到免费域名证书,目前它支持申请下面的 CA:
- ZeroSSL.com CA(default)
- Letsencrypt.org CA
- BuyPass.com CA
- SSL.com CA
- Google.com Public CA
- Pebble strict Mode
- Any other RFC8555-compliant CA
Install acme.sh
安装 acme.sh 非常简单,执行下面命令,记得替换下邮箱地址,不用真实邮箱地址
curl https://get.acme.sh | sh -s email=my@example.com
普通用户和 root 用户都可以安装使用. 安装过程进行了以下几步:
- 把 acme.sh 安装到你的 home 目录下:
- 自动创建 alias : acme.sh=~/.acme.sh/acme.sh
- 当前用户创建定时任务去检查和更新证书
申请 letsencrypt 证书
如果安装 acme.sh 没有指定邮箱(使用-s email=my@example.com参数),需要执行以下命令去注册 account key 和指定邮箱地址
acme.sh --register-account -m zzwade@163.com
默认 ca 是 ZeroSSL,使用 --set-default-ca --server letsencrypt 修改成 letsencrypt,这里使用手动 dns 方式
acme.sh --set-default-ca --server letsencrypt --issue --dns -d "*.zwade.top" -d "zwade.top" --yes-I-know-dns-manual-mode-enough-go-ahead-please
执行还是报错
查看文件,ACCOUNT_EMAIL 还是 my@example.com 修改 ACCOUNT_EMAIL 的值
vim ~/.acme.sh/account.conf
重新执行,提示需要添加两条 txt dns 记录
dns 控制台添加记录
检查 txt 记录是否生效
等待解析完成之后, 重新生成证书, 注意第二次这里用的是 --renew:
root@devops:/data/compose# acme.sh --renew -d "*.zwade.top" -d "zwade.top" --yes-I-know-dns-manual-mode-enough-go-ahead-please
[Sun Aug 18 23:43:42 CST 2024] The domain '*.zwade.top' seems to already have an ECC cert, let's use it.
[Sun Aug 18 23:43:42 CST 2024] Renewing: '*.zwade.top'
[Sun Aug 18 23:43:42 CST 2024] Renewing using Le_API=https://acme-v02.api.letsencrypt.org/directory
[Sun Aug 18 23:43:43 CST 2024] Using CA: https://acme-v02.api.letsencrypt.org/directory
[Sun Aug 18 23:43:43 CST 2024] Multi domain='DNS:*.zwade.top,DNS:zwade.top'
[Sun Aug 18 23:43:43 CST 2024] Verifying: *.zwade.top
[Sun Aug 18 23:43:44 CST 2024] Pending. The CA is processing your order, please wait. (1/30)
[Sun Aug 18 23:43:48 CST 2024] Success
[Sun Aug 18 23:43:48 CST 2024] Verifying: zwade.top
[Sun Aug 18 23:43:48 CST 2024] Pending. The CA is processing your order, please wait. (1/30)
[Sun Aug 18 23:43:52 CST 2024] Success
[Sun Aug 18 23:43:52 CST 2024] Verification finished, beginning signing.
[Sun Aug 18 23:43:52 CST 2024] Let's finalize the order.
[Sun Aug 18 23:43:52 CST 2024] Le_OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/1897682456/297359455456'
[Sun Aug 18 23:43:53 CST 2024] Downloading cert.
[Sun Aug 18 23:43:53 CST 2024] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/0372e45a153daff649f272e9b3b197020ff5'
[Sun Aug 18 23:43:53 CST 2024] Cert success.
-----BEGIN CERTIFICATE-----
MIIDgzCCAwigAwIBAgISA3LkWhU9r/ZJ8nLps7GXAg/1MAoGCCqGSM49BAMDMDIx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF
NTAeFw0yNDA4MTgxNDQ1MjJaFw0yNDExMTYxNDQ1MjFaMBYxFDASBgNVBAMMCyou
endhZGUudG9wMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEg5goXXOFWLDkqjfy
Dzxp019OnwrDYsKbReEMytMww37pzyWuL8lP2BTOScgj7UDDHYZqPWfyIge/NY/y
rsfgKaOCAhgwggIUMA4GA1UdDwEB/wQEAwIHgDAdBgNVHSUEFjAUBggrBgEFBQcD
AQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUEUcLCtPY8aqMwzW2
VDHEzy/nuM4wHwYDVR0jBBgwFoAUnytfzzwhT50Et+0rLMTGcIvS1w0wVQYIKwYB
BQUHAQEESTBHMCEGCCsGAQUFBzABhhVodHRwOi8vZTUuby5sZW5jci5vcmcwIgYI
KwYBBQUHMAKGFmh0dHA6Ly9lNS5pLmxlbmNyLm9yZy8wIQYDVR0RBBowGIILKi56
d2FkZS50b3CCCXp3YWRlLnRvcDATBgNVHSAEDDAKMAgGBmeBDAECATCCAQQGCisG
AQQB1nkCBAIEgfUEgfIA8AB2AD8XS0/XIkdYlB1lHIS+DRLtkDd/H4Vq68G/KIXs
+GRuAAABkWYowlsAAAQDAEcwRQIgGdVJ3UE6zu/tiFpJzkDBye2kgfGLUKF18ObN
4CwhuvcCIQDeUxDODXBzsOLZuYZcEkO+AK6LyiELAwCXjGRBGFLhXwB2AHb/iD8K
tvuVUcJhzPWHujS0pM27KdxoQgqf5mdMWjp0AAABkWYowp8AAAQDAEcwRQIhAKzw
590GfHvAPRCA/lr5a3P8h7WIxkpwJai6kJolIul0AiAU0XOfjFTv1ZP15CKulm2O
mZBWrws/0oc0xlFWqwNQ6zAKBggqhkjOPQQDAwNpADBmAjEAwCMtwOIf9OLP888y
7cF+2sn7BmA2DRKlU8Q8g06ik02uUCW9X4jBKvxwGn2dKGccAjEArMujolb6OzYd
R1rGjzDWJe2GY3qaCF9g3tvic/HVp2OS/atuefAs4QgFdkgw3tOu
-----END CERTIFICATE-----
[Sun Aug 18 23:43:53 CST 2024] Your cert is in: /root/.acme.sh/*.zwade.top_ecc/*.zwade.top.cer
[Sun Aug 18 23:43:53 CST 2024] Your cert key is in: /root/.acme.sh/*.zwade.top_ecc/*.zwade.top.key
[Sun Aug 18 23:43:53 CST 2024] The intermediate CA cert is in: /root/.acme.sh/*.zwade.top_ecc/ca.cer
[Sun Aug 18 23:43:53 CST 2024] And the full-chain cert is in: /root/.acme.sh/*.zwade.top_ecc/fullchain.cer
使用 openssl 命令查看证书信息
申请的证书和私钥存放在 /root/.acme.sh/*.zwade.top_ecc/ 目录,可以使用 openssl 命令查看证书内容
配置 Nginx 域名证书访问
将申请好的证书 copy 到 nginx 相应目录下,配置 nginx 域名 https 访问
# test.zwade.top.conf
# generated 2024-08-18, Mozilla Guideline v5.7, nginx 1.17.7, OpenSSL 1.d1.1k, intermediate configuration
# https://ssl-config.mozilla.org/#server=nginx&version=1.17.7&config=intermediate&openssl=1.d1.1k&guideline=5.7
server {
listen 80;
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name *.zwade.top;
ssl_certificate /etc/nginx/conf.d/ssl/zwade.top/zwade.top.cer;
ssl_certificate_key /etc/nginx/conf.d/ssl/zwade.top/zwade.top.key;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
# curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
ssl_dhparam /etc/nginx/conf.d/dhparam;
# intermediate configuration
ssl_protocols TLSv1.2;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers off;
# HSTS (ngx_http_headers_module is required) (63072000 seconds)
add_header Strict-Transport-Security "max-age=63072000" always;
# OCSP stapling
ssl_stapling on;
ssl_stapling_verify on;
location / {
default_type text/plain;
echo "Can you see me?";
}
}
测试访问
root@devops:/data/compose/openresty/conf.d# curl -sv https://test.zwade.top/
* Host test.zwade.top:443 was resolved.
* IPv6: (none)
* IPv4: 3.76.222.255
* Trying 3.76.222.255:443...
* Connected to test.zwade.top (3.76.222.255) port 443
* ALPN: curl offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* CAfile: /etc/ssl/certs/ca-certificates.crt
* CApath: /etc/ssl/certs
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-ECDSA-AES256-GCM-SHA384 / X25519 / id-ecPublicKey
* ALPN: server accepted h2
* Server certificate:
* subject: CN=*.zwade.top
* start date: Aug 18 14:45:22 2024 GMT
* expire date: Nov 16 14:45:21 2024 GMT
* subjectAltName: host "test.zwade.top" matched cert's "*.zwade.top"
* issuer: C=US; O=Let's Encrypt; CN=E5
* SSL certificate verify ok.
* Certificate level 0: Public key type EC/prime256v1 (256/128 Bits/secBits), signed using ecdsa-with-SHA384
* Certificate level 1: Public key type EC/secp384r1 (384/192 Bits/secBits), signed using sha256WithRSAEncryption
* Certificate level 2: Public key type RSA (4096/152 Bits/secBits), signed using sha256WithRSAEncryption
* using HTTP/2
* [HTTP/2] [1] OPENED stream for https://test.zwade.top/
* [HTTP/2] [1] [:method: GET]
* [HTTP/2] [1] [:scheme: https]
* [HTTP/2] [1] [:authority: test.zwade.top]
* [HTTP/2] [1] [:path: /]
* [HTTP/2] [1] [user-agent: curl/8.5.0]
* [HTTP/2] [1] [accept: */*]
> GET / HTTP/2
> Host: test.zwade.top
> User-Agent: curl/8.5.0
> Accept: */*
>
< HTTP/2 200
< server: openresty
< date: Mon, 19 Aug 2024 06:34:25 GMT
< content-type: text/plain
< strict-transport-security: max-age=63072000
<
Can you see me?
* Connection #0 to host test.zwade.top left intact