菜单
一、阿里云免费证书
1.1登录阿里云控制台
登录后进入SSL证书管理(当前更名为:数字证书管理服务),点击SSL证书管理。点击个人测试证书。单用户每年只能购买一次,每年可申请20个证书。当前每年仅3个月有效期。降本。购买后如下:
1.2创建证书
1.3 证书申请
1.4 配置DNS解析
略
1.5 修改nginx的配置文件
server {
#HTTPS的默认访问端口443。
#如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。
listen 443 ssl;
#填写证书绑定的域名
server_name <yourdomain>;
#填写证书文件绝对路径
ssl_certificate cert/<cert-file-name>.pem;
#填写证书私钥文件绝对路径
ssl_certificate_key cert/<cert-file-name>.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
#自定义设置使用的TLS协议的类型以及加密套件(以下为配置示例,请您自行评估是否需要配置)
#TLS协议版本越高,HTTPS通信的安全性越高,但是相较于低版本TLS协议,高版本TLS协议对浏览器的兼容性较差。
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;
location / {
root html;
index index.html index.htm;
}
}
重启Nginx服务。访问
但是以上方式每3个月需要人工操作。麻烦,有其他自动化解决方案吗?
二、证书自动签发并自动解析阿里云DNS
2.1 创建阿里云子账号并开通权限
阿里云权限策略里边有一个“AliyunDNSFullAccess”,给子账号这个权限即可
创建完成后将AccessKey ID与Access Key Secret记下来备用。
2.2安装acme.sh
1)安装很简单,命令如下,把 acme.sh 安装到你的 home
shell>>cd ~
shell>>git clone https://github.com/acmesh-official/acme.sh.git
shell>>cd acme.sh
shell>>./acme.sh --install -m my@example.com
强烈建议添加一条别名命令方便后边执行
shell>alias acme.sh=~/.acme.sh/acme.sh
2.3设置环境变量
将之前步骤中准备好的阿里云Accesskey填写到上面命令的中,并在终端中执行,执行后并不会有内容返回
export Ali_Key="yourAli_Key"
export Ali_Secret="yourAli_Secret"
2.4 证书签发
准备签发证书的命令,因为是签发,所以要使用“–issue”参数
shell>>./acme.sh --issue --dns dns_ali -d roadever.com.cn -d *.roadever.com.cn --cert-home /data/app/acme/cert
shell>>cd /data/app/acme/cert
[root@iZgc71arx7ijywr94r79eoZ roadever.com.cn_ecc]# ls
ca.cer fullchain.cer roadever.com.cn.cer roadever.com.cn.conf roadever.com.cn.csr roadever.com.cn.csr.conf roadever.com.cn.key
2.5 配置Nginx
将文件迁移至Nginx的cert,最后修改nginx配置文件如下:
此处因为多域名原因,将fullchain.cer命名为roadever.fullchain.cer
server {
#监听443端口
listen 443 ssl;
#对应的域名
server_name roadever.com.cn www.roadever.com.cn;
ssl_certificate cert/roadever.fullchain.cer;
ssl_certificate_key cert/roadever.com.cn.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8081;
}
location ~ .*\.(js|css)$ {
proxy_pass http://127.0.0.1:8081;
}
}
三、创建自动任务执行证书更新
#!/bin/bash
# 切换到 acme.sh 目录
###参数######
# 证书文件路径
FCORS_CERTIFICATE_PATH="/data/app/nginx/conf/cert/fcors.com_ecc/fullchain.cer"
ROADEVER_CERTIFICATE_PATH="/data/app/nginx/conf/cert/roadever.com.cn_ecc/fullchain.cer"
tomorrow_date=$(date -d tomorrow +%s)
####定义检测函数######
check_and_update_cert() {
local certificate_path="\$1" # 使用传入的证书路径
local domainname="\$2" # 使用传入的域名
tomorrow_date=$(date -d tomorrow +%s)
FCORS_NOT_AFTER=$(openssl x509 -in "$FCORS_CERTIFICATE_PATH" -noout -dates | grep 'notAfter' | cut -d= -f2)
# 将证书的 notAfter 日期转为日期格式
not_after_date=$(date -d "$FCORS_NOT_AFTER" +%s)
# 比较证书的有效期和明天的日期
if [ "$not_after_date" -le "$tomorrow_date" ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') $FCORS_CERTIFICATE_PATH 证书有效期: $FCORS_NOT_AFTER,马上执行更新" >> /data/app/acme/refresh_https.log
# acme.sh --issue --dns dns_ali -d $domainname -d *.$domainname \
# --cert-home /data/app/nginx/conf/cert \
# --reloadcmd "nginx -s reload"
else
echo "$(date '+%Y-%m-%d %H:%M:%S') $FCORS_CERTIFICATE_PATH 证书有效期: $FCORS_NOT_AFTER,跳过本次更新" >> /data/app/acme/refresh_https.log
fi
}
# 执行 roadever.com.cn 证书更新
check_and_update_cert "$ROADEVER_CERTIFICATE_PATH" "$tomorrow_date" "roadever.com.cn"
#acme.sh --issue --dns dns_ali -d roadever.com.cn -d *.roadever.com.cn --cert-home /data/app/nginx/conf/cert
# 退出脚本
exit 0
shell>crontab -e
shell>0 8 * * * /data/app/acme/refresh_https.sh