原 使用acme.sh申请更新Let's encrypt证书支持HTTPS
在这里使用acme.sh这个Shell脚本客户端来更新获取Let's encrypt证书,相对于Let's Encrypt那个certbot
python工具,依赖很多三方库,这个使用更便捷,并且支持泛型域名的DNS记录自助添加和证书的自动更新,纯“傻瓜式”工具。
一、安装
直接在命令行下执行
curl https://get.acme.sh | sh
或:
wget -O - https://get.acme.sh | sh
- 这个脚本会把acme.sh安装到当前用户的
home
目录下:~/.acme.sh/
,同时生成的证书也是在这个目录下。 - 并创建 一个 bash的alias, 方便你的使用:
alias acme.sh=~/.acme.sh/acme.sh
- 自动为你创建cronjob定时执行任务, 每天0:00点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书.
可以通过crontab -l
查看可知添加定时任务如下:0 0 * * * "/home/user/.acme.sh"/acme.sh --cron --home "/home/user/.acme.sh" > /dev/null
安装完成后执行acme.sh -h
来验证acme.sh是否安装成功,如果提示命令没找到,可以重新打开终端或者执行以下指令:
source ~/.bashrc
二、获取证书
acme.sh可以自动配置DNS TXT记录以让Let's encrypt验证当前服务器的所有权,因此不用再手动去域名服务商后台操作解析记录了,相对于certbot
方便了不少。
但在使用之前,首先要确认设置你使用的DNS解析服务商的API Token,这里以DNSPod为例,先设置DNSPod.cn域名API使用的token:
然后在命令行中设置你的token:
export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"
接着就可以使用acme.sh来自动配置Let's encrypt的通配符证书了:
acme.sh --issue --dns dns_dp -d example.com -d *.example.com
这里的DP_ID和DP_Key将被保存在~/.acme.sh/account.conf
,它将在需要时被重用。
可以在acme.sh的wiki查看其支持的dnsapi列表
三、安装证书
前面证书生成以后, 接下来需要把证书 copy 到真正需要用它的地方。
注意, 默认生成的证书都放在安装目录下: ~/.acme.sh/
, 请不要直接使用此目录下的文件,例如: 不要直接让nginx/apache
的配置文件使用这下面的文件.
这里面的文件都是内部使用, 而且目录结构可能会变化.正确的使用方法是使用 --installcert 命令,并指定目标位置, 然后证书文件会被copy到相应的位置.
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"
最后将生成的公䄴与私䄴配置到对应Apache/Nginx配置文件中。
默认情况下,证书将每60天更新一次(这是可配置的)。 证书更新后,将通过以下命令自动重新加载Apache/Nginx服务:service apache2 force-reload
或service nginx force-reload
。
请注意:reloadcmd
非常重要,它让服务器证书自动更新;但是如果reloadcmd
没有正确的执行,该证书可能无法刷新到您的服务器(例如nginx或apache),那么您的网站将无法在60天内显示更新的证书。
比如有的Linux用户执行service命令需要sudo命令,如下可以配置sudo让reload服务不需要sudo,例:修改一下 sudoer 文件,让 sudo service nginx force-reload 不需要输入密码:
sudo visudo
打开文件以后新增:
ubuntu ALL=(ALL) NOPASSWD: /usr/sbin/service nginx force-reload
NOTE: ubuntu 是 acme.sh 安装所用的账号
四、配置HTTPS证书
以nginx为例,要开启SSL十分简单,示例配置文件如下
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/fullchain/nginx/cert.pem;
ssl_certificate_key /path/to/keyfile/in/nginx/key.pem;
# 其他省略
}
但是默认情况下,如果你不给nginx做进一步的安全配置的话,你用SSLLABS来给你刚刚建立的网站来个安全测试,结果一定是这样的
一个大大的B?!
原因是你的diffie-hellman算法强度太低,这个diffie-hellman算法是用来干啥的呢?他的作用就是让访问的者浏览器和你的服务器能安全的交换密钥,具体原理就自行谷歌吧。总之nginx默认采用1024位的diffie-hellman,强度太低太危险,容易被别有用心的黑客叔叔破解,自己生成一个2048位的去替换掉就好啦。
openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048 # 如果你的机器性能足够强大,可以用 4096 位加密
经过漫长的等待(这就要看你的vps cpu性能如何了),你的目录下面应该已经出现了一个dhparam.pem文件,接下来我们就要修改nginx的配置文件,让他启用我们新生成的diffie-hellman,并且屏蔽容易被攻击的协议。
修改conf文件:
server {
listen 443 ssl http2; # 支持http/2
server_name www.example.com;
ssl_certificate /path/to/fullchain/nginx/cert.pem; # 公䄴
ssl_certificate_key /path/to/keyfile/in/nginx/key.pem; # 私钥
ssl_dhparam /etc/ssl/certs/dhparam.pem; # 刚刚生成的那个pem文件的路径
ssl_session_cache shared:SSL:10m; # 开启缓存,有利于减少ssl握手开销
ssl_session_timeout 10m; # SSL会话过期时间,有利于减少服务器开销
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;# 指定可用的ssl协议,排除sslV3等容易被攻击的协议
ssl_stapling on; # 开启证书吊销状态检查
ssl_ciphers "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA"; # 加密顺序,屏蔽不安全的加密方式
ssl_prefer_server_ciphers on; # 让服务器决定最佳加密方法
# 其他省略
}
这里开启了HTTP/2,关于HTTP/2可以查看:https://kiwenlau.com/2019/10/28/speedup-fundebug-by-using-http2/
访问 ssllabs.com 输入你的域名,检查 SSL 的配置是否都正常:
https://ssllabs.com/ssltest/analyze.html
确保验证结果有A以上,否则根据提示调整问题:
五、其它
更新 acme.sh
目前由于 acme 协议和 letsencrypt CA 都在频繁的更新, 因此acme.sh也经常更新以保持同步.
升级 acme.sh 到最新版 :
acme.sh --upgrade
如果你不想手动升级, 可以开启自动升级(默认acme.sh是开启自动更新的):
acme.sh --upgrade --auto-upgrade
之后, acme.sh 就会自动保持更新了.你也可以随时关闭自动更新:
acme.sh --upgrade --auto-upgrade 0
暂无评论