一直想把自己的网站加上 SSL 证书,昨天终于找到一个既方便又免费的方法,就是 acme.sh ,它可以自动生成证书并自动更新证书,省心省力,于是将自己的两个域名添加了 SSL 证书,实现起来还是比较简单的。
1. 安装 acme.sh
curl https://get.acme.sh | sh
2. 生成证书
acme.sh 目前支持 cloudflare,dnspod,cloudxns,godaddy 以及 ovh 等数十种解析商的自动集成,我的域名在 dnspod 中管理,首先需要进入 dnspod 生成 API Token ,并将生成的 ID 和 Token 记录下来写在下面的命令中,证书就会自动生成了。
export DP_Id="1234"
export DP_Key="xxxxxxxxxxxxx"
acme.sh --issue --dns dns_dp -d domain.com -d www.domain.com
如果要申请多个域名的证书,只需执行下面的命令即可,无需再次指定 api id 和 api key,当然,如果域名不在 dnspod 也是需要重新指定 api id 和 api key 的。
acme.sh --issue --dns dns_dp -d domain2.com -d www.domain2.com
另外,还有一种 http 生成证书的方式,这种方式无需提供 API Token (由于 acme.sh 升级,默认 CA 为 ZeroSSL,如继续要使用 letsencrypt 则需要在命令行使用 --server letsencrypt 指定出来):
acme.sh --issue -d domain3.com -d www.domain3.com --nginx --server letsencrypt
3. 安装证书
使用 --install-cert 命令,并指定目标位置, 然后证书文件会被拷贝到相应的位置。
Nginx example:
acme.sh --install-cert -d domain.com \
--key-file /usr/share/nginx/ssl/domain.com_key.pem \
--fullchain-file /usr/share/nginx/ssl/domain.com_cert.pem \
--reloadcmd "service nginx force-reload"
4. 修改 nginx 配置
# 将 http 转成 https
server {
listen 80;
server_name www.domain.com domain.com;
rewrite ^(.*)$ https://${server_name}$1 permanent;
}
# 增加 ssl 配置
server {
listen 443 ssl;
server_name www.domain.com domain.com;
ssl_certificate /usr/share/nginx/ssl/domain.com_cert.pem;
ssl_certificate_key /usr/share/nginx/ssl/domain.com_key.pem;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
...
}
5. 更新证书
目前证书在 60 天以后会自动更新,无需任何操作,实际上当安装了 acme.sh 后已经自动创建了 cronjob,在每天的 0:00 点后自动检测所有的证书,对于快过期的证书,会自动更新。
6. 更新 acme.sh
升级到最新版:
acme.sh --upgrade
如果不想手动升级,可以开启自动升级,acme.sh 会自动保持更新:
acme.sh --upgrade --auto-upgrade