acme.sh是一个纯Shell脚本实现的ACME协议客户端,它可以用来申请和管理Let’s Encrypt的免费SSL证书。Let’s Encrypt只提供DV类型的证书,也就是只验证域名所有权,不验证组织或个人信息。它支持两种验证方式,一种是通过HTTP服务器验证,另一种是通过DNS记录验证。今天我们要介绍的就是后者。
1.获取阿里云DNS修改的Accesskey
在签发证书前,你需要准备阿里云账户的Accesskey。请打开以下地址并创建AccessKey:
https://usercenter.console.aliyun.com/#/manage/ak
注意!为了提高安全性,建议你参考阿里云的文档,创建子账户后再创建API key,但这不是必须的。
创建完成后,请记下AccessKey ID和Access Key Secret。
2.安装acme.sh
2.1 安装很简单,只需执行以下命令,把 acme.sh 安装到你的 home 目录下:~/.acme.sh/
cd ~
git clone https://github.com/acmesh-official/acme.sh.git
cd acme.sh
./acme.sh --install -m my@example.com
或者使用安装脚本
# 安装记录
Acme:~# curl https://get.acme.sh | sh -s email=my@example.com
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1032 0 1032 0 0 942 0 --:--:-- 0:00:01 --:--:-- 943
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 216k 100 216k 0 0 10138 0 0:00:21 0:00:21 --:--:-- 9739
[Thu May 11 22:54:33 CST 2023] Installing from online archive.
[Thu May 11 22:54:33 CST 2023] Downloading https://github.com/acmesh-official/acme.sh/archive/master.tar.gz
[Thu May 11 22:54:34 CST 2023] Extracting master.tar.gz
[Thu May 11 22:54:35 CST 2023] It is recommended to install socat first.
[Thu May 11 22:54:35 CST 2023] We use socat for standalone server if you use standalone mode.
[Thu May 11 22:54:35 CST 2023] If you don't use standalone mode, just ignore this warning.
[Thu May 11 22:54:35 CST 2023] Installing to /root/.acme.sh
[Thu May 11 22:54:35 CST 2023] Installed to /root/.acme.sh/acme.sh
[Thu May 11 22:54:35 CST 2023] No profile is found, you will need to go into /root/.acme.sh to use acme.sh
[Thu May 11 22:54:35 CST 2023] Installing cron job
[Thu May 11 22:54:35 CST 2023] OK
[Thu May 11 22:54:35 CST 2023] Install success!
说明:my@example.com 替换为你自己的邮箱或者不填
默认情况下,acme.sh以隐藏文件夹的形式安装在用户的home目录下。
2.2 它还会创建一个定时任务,通过以下命令即可查看:
crontab -l
输出:
13 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
定时任务会在每天0点13分调用acme.sh程序,以检查证书是否过期,是否需要续签等。这个定时任务的时间是随机的,但不影响主要功能。
2.3 强烈建议添加一条别名命令方便后面执行
alias acme.sh=~/.acme.sh/acme.sh
3.运行acme.sh申请证书
3.1完成安装后先来准备脚本,这个脚本只需要执行一次。执行后,这些信息会记录在相关目录中,后续的执行将自动执行。
将之前步骤中准备好的阿里云Accesskey填写到下面命令中,并在终端中执行。执行后并不会有内容返回。
export Ali_Key="sddi*********daf"
export Ali_Secret="jls******************lsa"
3.2然后准备签发证书的命令,因为是签发,所以要使用“–issue”参数;指明使用“dns_ali”作为验证方式;后面跟着的“-d”为指定证书中的域名。这里有一点需要注意的:如果证书中只包含泛域名,那么签发出来的证书是没有根域的。所以需要额外添加一个根域。
acme.sh --issue --dns dns_ali -d orcy.net -d *.orcy.net
# 默认生成证书的算法为 ECC
# 如果需要生成RSA算法的证书,在命令追加参数--keylength 2048
# acme.sh --issue --dns dns_ali -d orcy.net -d *.orcy.net --keylength 2048
在执行命令后,程序会调用阿里云的API,在DNS中添加以下内容:
然后程序会等待120秒,以便让DNS生效,而后再调用Let’s Encrypt的API进行验证与证书的签发工作。如果一切正常,验证通过之后,会完成证书签发的工作,并将DNS中用于验证域名所有权的TXT解析记录删除。
其他厂商的DNS API信息请参考以下链接:https://github.com/acmesh-official/acme.sh/tree/master/dnsapi
4.证书使用
完成签发后,再看看acme.sh安装目录中,会发现以相关域名命名的文件夹:
[root@centos .acme.sh]# ll -h
总用量 236K
-rw-r--r--. 1 root root 307 3月 14 20:02 account.conf
-rwxr-xr-x. 1 root root 205K 3月 14 18:15 acme.sh
-rw-r--r--. 1 root root 78 3月 14 18:15 acme.sh.csh
-rw-r--r--. 1 root root 78 3月 14 18:15 acme.sh.env
drwxr-xr-x. 3 root root 42 3月 14 19:51 ca
drwxr-xr-x. 2 root root 4.0K 3月 14 18:15 deploy
drwxr-xr-x. 2 root root 4.0K 3月 14 18:15 dnsapi
-rw-r--r--. 1 root root 518 3月 14 20:02 http.header
drwxr-xr-x. 2 root root 243 3月 14 18:15 notify
drwxr-xr-x. 2 root root 147 3月 14 20:02 orcy.net
# 域名文件夹中有以下文件:
[root@centos .acme.sh]# cd orcy.net/
[root@centos orcy.net]# ll -h
总用量 28K
-rw-r--r--. 1 root root 1.6K 3月 14 20:02 ca.cer
-rw-r--r--. 1 root root 3.4K 3月 14 20:02 fullchain.cer
-rw-r--r--. 1 root root 1.8K 3月 14 20:02 orcy.net.cer
-rw-r--r--. 1 root root 644 3月 14 20:02 orcy.net.conf
-rw-r--r--. 1 root root 976 3月 14 20:01 orcy.net.csr
-rw-r--r--. 1 root root 218 3月 14 20:01 orcy.net.csr.conf
-rw-r--r--. 1 root root 1.7K 3月 14 19:51 orcy.net.key
文件说明:
- ca.cer:Let’s Encrypt的中级证书
- fullchain.cer:包含中级证书的域名证书
- orcy.net.cer:无中级证书的域名证书
- orcy.net.conf:该域名的配置文件
- orcy.net.csr:该域名的CSR证书请求文件
- orcy.net.csr.conf:该域名的CSR请求文件的配置文件
- orcy.net.key:该域名证书的私钥
相关命令:
openssl req -noout -text -in orcy.net.csr //检查csr文件
openssl rsa -noout -text -in orcy.net.key //检查私钥
openssl x509 -noout -text -in fullchain.cer //检查证书文件
如果你要在nginx中使用证书,你只需要域名证书和私钥,它们都包含了中级证书。请不要修改其他文件,并且保护好acme.sh安装目录中的所有文件。如果文件泄露了,你要及时更换API key、吊销证书并且注销Let’s Encrypt账号。
具体配置如下
server {
listen 443 ssl;
server_name orcy.net;
ssl_certificate /usr/local/nginx/ssl/orcy.net.crt;
ssl_certificate_key /usr/local/nginx/ssl/orcy.net.key;
ssl_buffer_size 16k;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ecdh_curve X25519:P-256:P-384:P-224:P-521;
ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256;
ssl_prefer_server_ciphers on;
ssl_session_timeout 3h;
ssl_stapling on;
ssl_session_tickets on;
access_log /var/log/nginx/access.log main;
add_header Strict-Transport-Security "max-age=31536000; preload; includeSubDomains" always;
add_header X-Frame-Options SAMEORIGIN;
index index.php index.html;
location / {
root /usr/local/nginx/html;
}
}
你可以通过浏览器打开网站,检查证书的信息。Let’s Encrypt签发的证书有效期为90天,也就是说一年至少要更换4次。不过,acme.sh支持自动部署和调用脚本。你可以自己编写脚本,把证书分发到各个节点。
如何使用acme.sh将证书复制或安装到需要的地方
1.注意事项
生成证书后,你需要把证书复制或安装到真正需要用它的地方。
注意!默认生成的证书都放在安装目录下: ~/.acme.sh/
,请不要直接使用此目录下的文件,例如: 不要直接让 nginx/apache 的配置文件使用这下面的文件。这里面的文件都是内部使用,而且目录结构可能会变化。
2.正确的方法
正确的方法是使用 --install-cert
命令,并指定目标位置,然后证书文件会被复制或安装到相应的位置,例如:
Apache 示例:
acme.sh --install-cert -d example.com \
--cert-file /path/to/certfile/in/apache/cert.pem \
--key-file /path/to/keyfile/in/apache/key.pem \
--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
--reloadcmd "service apache2 force-reload"
Nginx 示例:
acme.sh --install-cert -d example.com \
--key-file /path/to/keyfile/in/nginx/key.pem \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "service nginx force-reload"
(一个小提醒,这里用的是 service nginx force-reload,不是 service nginx reload,据测试,reload 并不会重新加载证书,所以用的 force-reload),测试中实测编译安装的nginx使用 --reloadcmd "/usr/lcoal/nginx/sbin/nginx -s reolad" 可以生效!
Nginx 的配置 ssl_certificate 使用 /etc/nginx/ssl/fullchain.cer
,而非 /etc/nginx/ssl/.cer
,否则 SSL Labs 的测试会报 Chain issues Incomplete 错误。
--install-cert
命令可以携带很多参数,来指定目标文件。并且可以指定 reloadcmd,当证书更新后,reloadcmd 会被自动调用,让服务器生效。
详细参数请参考: https://github.com/acmesh-official/acme.sh#3-install-the-issued-cert-to-apachenginx-etc
值得注意的是,这里指定的所有参数都会被自动记录下来,并在将来证书自动更新后,被再次自动调用。
值得注意的是, 这里指定的所有参数都会被自动记录下来, 并在将来证书自动更新以后, 被再次自动调用。
Comments | NOTHING