今天介绍一个能自动从 Let’s Encrypt 颁发和续订免费证书的工具。
项目 Gitlab 地址:https://github.com/acmesh-official/acme.sh
首先需要有一个可访问的域名,并且将域名解析至对应的服务器地址。
第一步:安装
在 Linux 服务器上执行如下命令:
1
| curl https://get.acme.sh | sh
|
或者
1
| wget -O - https://get.acme.sh | sh
|
或者从 github 安装
1 2 3
| git clone https://github.com/acmesh-official/acme.sh.git cd ./acme.sh ./acme.sh --install
|
第二步:生成证书。
如果提示端口占用,可以先停掉占用端口的服务。
单域名:
1
| acme.sh --issue -d example.com --standalone
|
多域名:
1
| acme.sh --issue -d example.com -d www.example.com --standalone
|
如果输出内容如下:
1 2 3 4
| root@zhuo:~# acme.sh --issue -d example.com --standalone [Mon 09 Nov 2020 07:00:28 PM CST] Using CA: https://acme-v02.api.letsencrypt.org/directory [Mon 09 Nov 2020 07:00:28 PM CST] Please install socat tools first. [Mon 09 Nov 2020 07:00:28 PM CST] _on_before_issue.
|
则需要先安装 Socat
Socat 是 Linux 下的一个多功能的网络工具,名字来由是 「Socket CAT」。其功能与有瑞士军刀之称的 Netcat 类似,可以看做是 Netcat 的加强版。
Socat 的主要特点就是在两个数据流之间建立通道,且支持众多协议和链接方式。如 IP、TCP、 UDP、IPv6、PIPE、EXEC、System、Open、Proxy、Openssl、Socket等。
Socat 的官方网站:http://www.dest-unreach.org/socat/
安装命令:
Centos
Debian/Ubuntu
1
| $ apt-get install -y socat
|
安装完 Socat,再次执行命令生成证书
生成成功,输出内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| root@zhuo:~/.acme.sh [Mon 28 Dec 2020 02:37:29 PM CST] Using CA: https://acme-v02.api.letsencrypt.org/directory [Mon 28 Dec 2020 02:37:29 PM CST] Standalone mode. [Mon 28 Dec 2020 02:37:29 PM CST] Standalone mode. [Mon 28 Dec 2020 02:37:29 PM CST] Multi domain='DNS:example.com,DNS:www.example.com' [Mon 28 Dec 2020 02:37:29 PM CST] Getting domain auth token for each domain [Mon 28 Dec 2020 02:37:38 PM CST] Getting webroot for domain='example.com' [Mon 28 Dec 2020 02:37:38 PM CST] Getting webroot for domain='www.example.com' [Mon 28 Dec 2020 02:37:38 PM CST] Verifying: example.com [Mon 28 Dec 2020 02:37:38 PM CST] Standalone mode server [Mon 28 Dec 2020 02:37:44 PM CST] Success [Mon 28 Dec 2020 02:37:44 PM CST] Verifying: www.example.com [Mon 28 Dec 2020 02:37:44 PM CST] Standalone mode server [Mon 28 Dec 2020 02:37:50 PM CST] Success [Mon 28 Dec 2020 02:37:50 PM CST] Verify finished, start to sign. [Mon 28 Dec 2020 02:37:50 PM CST] Lets finalize the order. [Mon 28 Dec 2020 02:37:50 PM CST] Le_OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/96543253/2321987136' [Mon 28 Dec 2020 02:37:53 PM CST] Downloading cert. [Mon 28 Dec 2020 02:37:53 PM CST] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/036a2607576c7cb654f34601cc2285245d38' [Mon 28 Dec 2020 02:37:55 PM CST] Cert success. -----BEGIN CERTIFICATE----- MIIFTzCCBDegAwIBAgISA2omB1dsfLVi9icBzCKFJF04MA0GCSqGSIb3DQEBCwUA ... WoM6llNhcgSwsCy+8SMLJy6XuysA4g8MV+nv5oaxBUgXDbGCiAZrSdWRwPai+vi4 vYG+xYjCq7tgswkLAz6uukTSPw== -----END CERTIFICATE----- [Mon 28 Dec 2020 02:37:55 PM CST] Your cert is in /root/.acme.sh/example.com/example.com.cer [Mon 28 Dec 2020 02:37:55 PM CST] Your cert key is in /root/.acme.sh/example.com/example.com.key [Mon 28 Dec 2020 02:37:55 PM CST] The intermediate CA cert is in /root/.acme.sh/example.com/ca.cer [Mon 28 Dec 2020 02:37:55 PM CST] And the full chain certs is there: /root/.acme.sh/example.com/fullchain.cer
|
输出信息中包含了证书路径。
第三步:配置 nginx
将证书拷贝至 nginx 对应的目录下
1 2
| cp /root/.acme.sh/example.com/example.com.key /usr/local/nginx/ssl/example.com.key cp /root/.acme.sh/example.com/fullchain.cer /usr/local/nginx/ssl/fullchain.cer
|
在配置文件 nginx.conf 中的 server 节点新增如下配置,证书路径需改为你自己的证书路径
1 2 3
| ssl on; ssl_certificate /usr/local/nginx/ssl/fullchain.cer; ssl_certificate_key /usr/local/nginx/ssl/example.com.key;
|
如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
| server { listen 443; server_name example.com; ssl on; ssl_certificate /usr/local/nginx/ssl/fullchain.cer; ssl_certificate_key /usr/local/nginx/ssl/example.com.key; charset utf-8; location / { root /usr/share/nginx/html; #访问路径,相当于 Tomcat 的 ROOT,这里自己配 index index.html index.htm; #访问 index try_files $uri $uri/ /index.html; } }
|
第四步:执行命令使配置生效
或直接重启 nginx 即可。
Https 证书到此配置完毕。
证书过期,重新生成证书
如果提示端口占用,可以先停掉占用端口的服务。
单域名:
1
| acme.sh --renew -d example.com
|
多域名:
1
| acme.sh --renew -d example.com -d www.example.com -d xxx.com
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| root@zhuo:/home/zhuo/nginx/ssl [Thu 28 Jan 2021 12:16:29 PM CST] Renew: 'example.com' [Thu 28 Jan 2021 12:16:31 PM CST] Using CA: https://acme-v02.api.letsencrypt.org/directory [Thu 28 Jan 2021 12:16:31 PM CST] Standalone mode. [Thu 28 Jan 2021 12:16:31 PM CST] Standalone mode. [Thu 28 Jan 2021 12:16:31 PM CST] Standalone mode. [Thu 28 Jan 2021 12:16:31 PM CST] Multi domain='DNS:example.com,DNS:www.example.com,DNS:xxx.com' [Thu 28 Jan 2021 12:16:31 PM CST] Getting domain auth token for each domain [Thu 28 Jan 2021 12:16:40 PM CST] Getting webroot for domain='example.com' [Thu 28 Jan 2021 12:16:40 PM CST] Getting webroot for domain='www.example.com' [Thu 28 Jan 2021 12:16:40 PM CST] Getting webroot for domain='xxx.com' [Thu 28 Jan 2021 12:16:40 PM CST] Verifying: example.com [Thu 28 Jan 2021 12:16:40 PM CST] Standalone mode server [Thu 28 Jan 2021 12:16:48 PM CST] Success [Thu 28 Jan 2021 12:16:48 PM CST] Verifying: www.example.com [Thu 28 Jan 2021 12:16:48 PM CST] Standalone mode server [Thu 28 Jan 2021 12:16:53 PM CST] Success [Thu 28 Jan 2021 12:16:53 PM CST] Verifying: xxx.com [Thu 28 Jan 2021 12:16:53 PM CST] Standalone mode server [Thu 28 Jan 2021 12:16:58 PM CST] Success [Thu 28 Jan 2021 12:16:58 PM CST] Verify finished, start to sign. [Thu 28 Jan 2021 12:16:58 PM CST] Lets finalize the order. [Thu 28 Jan 2021 12:16:58 PM CST] Le_OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/101291916/7567203492' [Thu 28 Jan 2021 12:17:00 PM CST] Downloading cert. [Thu 28 Jan 2021 12:17:00 PM CST] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/030c0a4b859281221354841535ab7314ad2e' [Thu 28 Jan 2021 12:17:01 PM CST] Cert success. -----BEGIN CERTIFICATE----- MIIFejCCBGKgAwIBAgISAwwKS4WSgSITVIQVNatzFK0uMA0GCSqGSIb3DQEBCwUA MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD ... B4kfqgGZDiAH94ffm/8mdk3pPFesqhEf0ew4ZI29WSNJaAYomoM38h9WG2OMunDN xGwTb6hqLB0zos29nd4VhDpgmujB+gnu+B/Dg4j4PWfi8rUx+f4PQCE98C/pfeQI r/JENs5VnKvTGYOD7sM= -----END CERTIFICATE----- [Thu 28 Jan 2021 12:17:01 PM CST] Your cert is in /root/.acme.sh/example.com/example.com.cer [Thu 28 Jan 2021 12:17:01 PM CST] Your cert key is in /root/.acme.sh/example.com/example.com.key [Thu 28 Jan 2021 12:17:01 PM CST] The intermediate CA cert is in /root/.acme.sh/example.com/ca.cer [Thu 28 Jan 2021 12:17:01 PM CST] And the full chain certs is there: /root/.acme.sh/example.com/fullchain.cer root@zhuo:/home/zhuo/nginx/ssl
|
Acme 更新
升级 acme.sh 到最新版 :