服务器常用软件
永久免费的SSL证书
acme.sh 实现了 acme 协议,可以从 ZeroSSL,Let's Encrypt 等 CA 生成免费的证书。 github地址>>
安装 acme.sh
curl https://get.acme.sh | sh -s email=my@example.com
# 或
wget -O - https://get.acme.sh | sh -s email=my@example.com
# 如果无法下载,直接访问github下载acme.sh文件,然后执行:
./acme.sh install
acme.sh --register-account -m my@example.com
并创建 一个 shell 的 alias,例如 .bashrc
,方便你的使用: alias acme.sh=~/.acme.sh/acme.sh
生成证书
cme.sh 实现了 acme 协议支持的所有验证协议。一般有两种方式验证: HTTP 和 DNS 验证。
HTTP 方式生成证书
# 直接签发
acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/
# Apache 模式
acme.sh --issue --apache -d example.com -d www.example.com -d cp.example.com
# Nginx 模式
acme.sh --issue --nginx -d example.com -d www.example.com -d cp.example.com
# 示例:生成多个二级域名的证书
acme.sh --issue --nginx \
-d example.com \
-d api.example.com \
-d jenkins.example.com \
-d yapi.example.com \
-d zero.example.com \
-d demo.example.com \
-d console.example.com \
-d admin.example.com
# 若一直出现:Pending,The CA is processing your order,please just wait.
# 修改默认CA,偶尔会出现Pending,可多试几次
acme.sh --set-default-ca --server letsencrypt
备注:若给已安装过的证书追加二级域名时报错如下,建议单独给二级域名生成证书。否则需要重新生成证书需要将已安装证书的80端口放开,不要转发443。否则会出现下面错误。
[Sat Feb 8 09:59:13 AM CST 2025] Checking the nginx config before setting up.
[Sat Feb 8 09:59:13 AM CST 2025] OK, setting up the nginx config file
[Sat Feb 8 09:59:13 AM CST 2025] nginx config has been written, let's check it again.
[Sat Feb 8 09:59:13 AM CST 2025] Reloading nginx
[Sat Feb 8 09:59:16 AM CST 2025] Pending. The CA is processing your order, please wait. (1/30)
[Sat Feb 8 09:59:20 AM CST 2025] kplus.example.com: Invalid status. Verification error details: 124.220.91.218: Invalid response from https://kplus.example.com/.well-known/acme-challenge/FwVX_Z3BAOPNFtloAsN1TswpJuKPpQ8fvYt9a9zJ6so:
[Sat Feb 8 09:59:21 AM CST 2025] Restoring from /root/.acme.sh/kplus.example.com_ecc/backup/kplus.example.com.nginx.conf to /etc/nginx/conf.d/kplus.kdaiy.conf
[Sat Feb 8 09:59:21 AM CST 2025] Reloading nginx
[Sat Feb 8 09:59:21 AM CST 2025] Please check log file for more details: /root/.acme.sh/acme.sh.log
DNS方式生成证书
如果你没有服务器,没有公网 IP,只需要 DNS 的解析记录即可完成验证。DNS分为手动模式和自动模式。DNS模式可以生成通配符证书。
- 手动模式 acme.sh 会生成相应的解析记录显示出来,你只需要在你的域名管理面板中添加这条 TXT 记录即可。 缺点:无法自动更新证书。
# 注意:通配符域名需要添加根域名。
acme.sh --issue -d nas.example.com -d *.nas.example.com --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please
- 自动模式 可以使用域名解析商提供的 API 自动添加 TXT 记录,且在完成验证后删除对应的记录。可自动更新证书。 先去域名厂商哪里申请apiKey(。详细参考),以阿里云为例,创建RAM用户或在已有用户中添加apiKey。点击前往>>
export Ali_Key='LTAI5tHUioGVTa1UdsdfwUEdfws'
export Ali_Secret='gafifdrRCQidhErSm09WDduwerEW2'
acme.sh --issue --dns dns_ali -d nas.example.com -d *.nas.example.com
这 Ali_Key 和 Ali_Secret 将保存在 ~/.acme.sh/account.conf 并将在需要时重复使用。
- 必坑指南 由于安装时curl和wget命令一直提示证书问题,于是自己在github仓库下载了acme.sh文件,然后执行 ./acme.sh install命令安装。结果安装后使用dns模式一直出现如下错误。
Cannot find DNS API hook for: dns_ali
. 各种尝试无法解决,对比之前的~/.acme.sh/下的文件,发现缺少dnsapi目录。
root@fnas:~/.acme.sh# acme.sh --issue --dns dns_ali -d nas.example.com -d *.nas.example.com
[Mon Mar 10 04:48:21 PM CST 2025] Using CA: https://acme-v02.api.letsencrypt.org/directory
[Mon Mar 10 04:48:21 PM CST 2025] Account key creation OK.
[Mon Mar 10 04:48:21 PM CST 2025] Registering account: https://acme-v02.api.letsencrypt.org/directory
[Mon Mar 10 04:48:22 PM CST 2025] Registered
[Mon Mar 10 04:48:22 PM CST 2025] ACCOUNT_THUMBPRINT='HWAZ_3yXMF2yQ6mwPeB7lkeVcrZBxEMLN_6KMLWoCjo'
[Mon Mar 10 04:48:22 PM CST 2025] Multi domain='DNS:nas.example.com,DNS:*.nas.example.com'
[Mon Mar 10 04:48:25 PM CST 2025] Getting webroot for domain='nas.example.com'
[Mon Mar 10 04:48:25 PM CST 2025] Getting webroot for domain='*.nas.example.com'
[Mon Mar 10 04:48:25 PM CST 2025] Cannot find DNS API hook for: dns_ali
[Mon Mar 10 04:48:25 PM CST 2025] You need to add the TXT record manually.
[Mon Mar 10 04:48:25 PM CST 2025] Add the following TXT record:
[Mon Mar 10 04:48:25 PM CST 2025] Domain: '_acme-challenge.nas.example.com'
[Mon Mar 10 04:48:25 PM CST 2025] TXT value: '55fyzZddTwLGw5OLNUxwBpKHHUz1R-NqUCNBYnwNVqI'
[Mon Mar 10 04:48:25 PM CST 2025] Please make sure to prepend '_acme-challenge.' to your domain
[Mon Mar 10 04:48:25 PM CST 2025] so that the resulting subdomain is: _acme-challenge.nas.example.com
[Mon Mar 10 04:48:25 PM CST 2025] Cannot find DNS API hook for: dns_ali
[Mon Mar 10 04:48:25 PM CST 2025] You need to add the TXT record manually.
[Mon Mar 10 04:48:25 PM CST 2025] Add the following TXT record:
[Mon Mar 10 04:48:25 PM CST 2025] Domain: '_acme-challenge.nas.example.com'
[Mon Mar 10 04:48:25 PM CST 2025] TXT value: 'u-UXlPr786AOOCsmdsHcb-fHX8aADQrUNEjdOZ689oI'
[Mon Mar 10 04:48:25 PM CST 2025] Please make sure to prepend '_acme-challenge.' to your domain
[Mon Mar 10 04:48:25 PM CST 2025] so that the resulting subdomain is: _acme-challenge.nas.example.com
[Mon Mar 10 04:48:25 PM CST 2025] Please add the TXT records to the domains, and re-run with --renew.
[Mon Mar 10 04:48:25 PM CST 2025] Please add '--debug' or '--log' to see more information.
[Mon Mar 10 04:48:25 PM CST 2025] See: https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh
安装证书
证书生成好以后,我们需要把证书复制给对应的 Apache、Nginx 或其他服务器去使用。
必须使用--install-cert
命令来把证书复制到目标文件,请勿直接使用 ~/.acme.sh/
目录下的证书文件,这里面的文件都是内部使用,而且目录结构将来可能会变化。
# 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/cert.pem \
--reloadcmd "service apache2 force-reload"
# Nginx 示例
acme.sh --install-cert -d example.com \
--key-file /path/to/keyfile/in/nginx/key.key \
--fullchain-file /path/to/fullchain/nginx/cert.cer \
--reloadcmd "service nginx reload"
# Nginx 多域名证书
acme.sh --install-cert \
-d www.example.com \
-d api.example.com \
-d jenkins.example.com \
-d yapi.example.com \
-d zero.example.com \
-d fina.example.com \
-d admin.example.com \
--key-file /etc/nginx/cert/acmessl/www.example.com.key \
--fullchain-file /etc/nginx/cert/acmessl/www.example.com.cer \
--reloadcmd "service nginx force-reload"
注意:reloadcmd
非常重要。证书会自动申请续签,但是如果没有正确的 reloadcmd
命令,证书可能无法被重新应用到 Apache 或者 Nginx,因为配置没有被重载。
安装完成后修改Nginx的配置,参考如下配置:
server {
# listen 80;
listen 443 ssl;
server_name www.example.com;
index index.html index.htm index.php;
ssl_certificate cert/acmessl/www.example.com.cer;
ssl_certificate_key cert/acmessl/www.example.com.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
....
}
更新证书
目前证书每 60 天自动更新,你无需任何操作。但是你也可以强制续签证书:
# 更新指定域名证书
acme.sh --renew -d example.com
# 强制更新所有证书
acme.sh --renew-all --force
############## 其他操作 ############
# 查看证书信息
acme.sh --info -d www.example.com
# 删除已颁发的证书
acme.sh --remove -d example.com
# 强制刷新指定域名的证书
acme.sh --renew -d api.example.com --force
更新acme.sh
acmd.sh 还在不断开发中,因此强烈建议保持并使用最新的版本。
# 升级 acme.sh 到最新版
acme.sh --upgrade
# 如果你不想手动升级,可以开启自动升级
acme.sh --upgrade --auto-upgrade
# 关闭自动更新
acme.sh --upgrade --auto-upgrade 0
删除证书
# 删除nginx域名证书
acme.sh --remove --nginx \
-d www.example.com \
-d api.example.com \
-d jenkins.example.com \
-d yapi.example.com \
-d zero.example.com \
-d demo.example.com \
-d console.example.com \
-d admin.example.com
详细步骤及使用指导参考github 帮助页面,前往查看>>