安装acme
我们使用acme来申请免费的https通用域名证书 acme的证书有效期为三个月,但会创建一个定时任务提前一个月来进行续约
安装acme
curl https://get.acme.sh | sh
cd ~/.acme.sh/
yum -y install socat
验证证书
为了验证域名所有权,Let's Encrypt 支持两种方式来验证:
- 通过阿里云DNS 验证域名
- 域名的访问
sh acme.sh --installcert -d 4d-bios.com --key-file /mnt/ssl/nginx/4d-bios.com/4d-bios.com.key --fullchain-file /mnt/ssl/nginx/4d-bios.com/fullchain.cer --reloadcmd "ssl.sh"
通过域名访问
sh acme.sh --issue -d [域名] --standalone
通过DNS来验证
我们通过创建一个阿里云的的子账户key 并对子账号授权DNS的权限
在.bashrc 里添加
export Ali_Key="xx" export Ali_Secret="xxx"
source ~/.bashrc
然后就可以执行验证了
acme.sh --issue --dns dns_ali -d [域名] -d *.[域名]
# 配置安装SSL证书路径和重启的命令
sh acme.sh --installcert -d [域名] \
--key-file /mnt/ssl/[域名].key \
--fullchain-file /mnt/ssl/fullchain.cer \
--reloadcmd "nginx -s reload"
NGINX 配置SSL证书
server {
listen 443;
server_name localhost;
ssl on;
root html;
index index.html index.htm;
ssl_certificate cert/xxx.pem;
ssl_certificate_key cert/xxx.key;
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;
location / {
root html;
index index.html index.htm;
}
}
证书的自动分发
由于有多台服务器都需要用到相同的证书,这时候证书的分发就成为了问题, 我们在一台公共机器的节点上利用ssh来实现分发,先配置好ssh免密登录
执行分发的脚本
#!/bin/bash
# 分发ssl证书
# 待分发的服务器list
SERVERS=("ip1" "ip2");
for str in ${SERVERS[@]}; do
scp -r /mnt/ssl/ $str:/mnt/
echo "SCP SSL TO $str"
ssh $str "docker restart nginx"
echo "SSH restart nginx "
done
sh acme.sh --installcert -d [域名] \
--key-file /mnt/ssl/[域名].key \
--fullchain-file /mnt/ssl/fullchain.cer \
--reloadcmd "ssl.sh" #指定定时执行上面的脚本