免费SSL证书签发配置Https

一、阿里云免费证书

1.1登录阿里云控制台

登录后进入SSL证书管理(当前更名为:数字证书管理服务),点击SSL证书管理。点击个人测试证书。单用户每年只能购买一次,每年可申请20个证书。当前每年仅3个月有效期。降本。购买后如下:

基础技术、技术与框架免费SSL证书签发配置Https插图

1.2创建证书

基础技术、技术与框架免费SSL证书签发配置Https插图1

1.3 证书申请

基础技术、技术与框架免费SSL证书签发配置Https插图2
基础技术、技术与框架免费SSL证书签发配置Https插图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
基础技术、技术与框架免费SSL证书签发配置Https插图4
[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
基础技术、技术与框架免费SSL证书签发配置Https插图5

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