尚拙

一个分享技术、学习成长的个人博客网站

0%

Linux使用 acme.sh 自动申请免费 SSL 证书

本文记录如何通过acme.sh生成免费SSL证书并自动续期。

一、acme.sh简介

acme.sh 实现了 acme 协议, 可以从 Let’s Encrypt 等平台生成免费的证书.

acme.sh的Github项目地址

https://github.com/acmesh-official/acme.sh

Let’s Encrypt 是一家免费、开放、自动化的公益性证书颁发机构(CA)。

二、安装 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

my@example.com替换成自己的邮箱

安装成功后,在 root 目录下 ls -a 就可以看到有一个.acme.sh的文件夹

创建一个别名方便使用:

alias acme.sh=~/.acme.sh/acme.sh

安装时已经为系统创建crontab定时任务,续签证书的调度任务,自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书,可以通过 crontab -l 查看。

安装过程中所有的修改都限制在安装目录~/.acme.sh/中,因此不用担心对已有的系统任何功能和文件污染。

三、生成证书

acme.sh 实现了 acme 协议支持的所有验证协议. 一般有两种方式验证: http 和 dns 验证。

1. http 方式

需要在你的网站根目录下放置一个文件, 来验证你的域名所有权,完成验证. 然后就可以生成证书了。

acme.sh --issue -d example.com -w /home/wwwroot/example.com

或者

acme.sh --issue -d example.com -w /home/username/public_html

或者

acme.sh --issue -d example.com -w /var/www/html

只需要指定域名, 并指定域名所在的网站根目录. acme.sh 会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证. 最后会聪明的删除验证文件. 整个过程没有任何副作用。

如果你用的 apache服务器, acme.sh 还可以智能的从 apache的配置中自动完成验证, 你不需要指定网站根目录:

acme.sh --issue -d mydomain.com --apache

如果你用的 nginx服务器, 或者反代, acme.sh 还可以智能的从 nginx的配置中自动完成验证, 你不需要指定网站根目录:

acme.sh --issue -d mydomain.com --nginx

注意, 无论是 apache 还是 nginx 模式, acme.sh在完成验证之后, 会恢复到之前的状态, 都不会私自更改你本身的配置。

acme.sh脚本默认ca服务器是zerossl,如果经常出错可以切换到其他服务器:
切换 Let’s Encrypt

acme.sh --set-default-ca --server letsencrypt

切换 ZeroSSL

acme.sh --set-default-ca --server zerossl

切换 SSL.com

acme.sh --set-default-ca --server ssl.com

切换 Google Public CA

acme.sh --set-default-ca --server google

支持同时为多个域名生成证书

acme.sh --issue -d example.com -d www.example.com -d cp.example.com -w /home/wwwroot/example.com

2、dns方式

dns 方式的真正强大之处在于可以使用域名解析商提供的 api 自动添加 txt 记录完成验证。

acme.sh 目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等数十种解析商的自动集成。
(1)登录到阿里云账号, 生成你的 api id 和 api key,然后进行配置

export Ali_Key="<key>"
export Ali_Secret="<secret>"

如果是其他平台可以在Github查看使用文档
(2)生成证书
这里以生成泛域名的证书为例(如果只需要生成一个域名的,直接一个-d接上域名即可)

acme.sh --issue --dns dns_ali -d example.com -d *.example.com

如果是DNSPod解析示例如下

export DP_Id="1234"

export DP_Key="sADDsdasdgdsf"

acme.sh --issue --dns dns_dp -d aa.com

四、安装证书

1、创建存放证书的文件夹

mkdir -p /etc/nginx/ssl/edu.lovehistory.top

2、安装证书

acme.sh --install-cert -d edu.lovehistory.top \
--key-file /etc/nginx/ssl/edu.lovehistory.top/edu.lovehistory.top.key \
--fullchain-file /etc/nginx/ssl/edu.lovehistory.top/fullchain.cer \
--reloadcmd "service nginx force-reload"

第一行中的edu.lovehistory.top为申请SSL证书的域名

五、配置SSL证书

在nginx目录下的conf文件的server模块配置SSL证书

server {
//监听IPv4的443端口,启用SSL加密
listen 443 ssl;
// 域名
server_name edu.lovehistory.top;
client_max_body_size 1024M;
//证书地址
ssl_certificate "/etc/nginx/ssl/edu.lovehistory.top/fullchain.cer";
//证书密钥
ssl_certificate_key "/etc/nginx/ssl/edu.lovehistory.top/edu.lovehistory.top.key";
//设置SSL会话缓存,用于存储SSL会话信息以提高性能
ssl_session_cache shared:SSL:1m;
//设置SSL会话的超时时间
ssl_session_timeout 10m;
//告诉Nginx优先使用在ssl_ciphers指令中指定的密码套件
ssl_prefer_server_ciphers on;
//包含/etc/nginx/default.d/目录下的所有配置文件,这些文件通常用于添加额外的配置指令
include /etc/nginx/default.d/*.conf;
location / {
include /etc/nginx/uwsgi_params;
uwsgi_pass 127.0.0.1:8001;
uwsgi_param UWSGI_SCRIPT /usr/local/work_space/le-huo/LeHuo/wsgi.py;
uwsgi_param UWSGI_CHDIR /usr/local/work_space/le-huo/;
}

location /static/ {
alias /usr/local/work_space/le-huo/static_files/;
}

}

配置HTTP自动重定向到HTTPS(可选)

server {
listen 80;
server_name edu.lovehistory.top;
return 301 https://$server_name$request_uri;
}

也可以配置HTTPS自动重定向到HTTP:

server {
listen 443;
server_name edu.lovehistory.top;
return 301 http://$server_name$request_uri;
}

六、更新证书

安装acme.sh后,所有证书将每60天自动更新一次。

但是,您也可以强制更新证书:

acme.sh --renew -d example.com --force

七、升级acme.sh

acme.sh 正在不断开发,因此强烈建议使用最新的代码。

您可以将 acme.sh 更新到最新代码:

acme.sh --upgrade

您还可以启用自动升级:

acme.sh --upgrade --auto-upgrade

然后acme.sh将自动保持更新。

禁用自动升级:

acme.sh --upgrade --auto-upgrade 0