https ssl申请

免费证书申请

ASnipaste_2025-01-10_12-44-04.jpg

先购买测试证书

AASnipaste_2025-01-10_12-45-43.jpg

创建证书

AAASnipaste_2025-01-10_12-48-15.jpg

点击更多查看信息

从证书中确认邮箱 和私钥算法

DDSnipaste_2025-01-10_12-53-41.jpg

AAASnipaste_2025-01-10_12-57-44.jpg

然后就可以部署了我这边用的的是 NGINX 建议参考帮助

ABASnipaste_2025-01-10_13-02-19.jpg

这边的路径需要特别注意

如果 NGINX 没起来 看日志找不到路径可以加上更上一级目录试试 (当然你也可以直接从根目录写死)

AASSnipaste_2025-01-10_13-06-34.jpg

这里申请就结束了

[nginx]ssl自动续签 替换脚本 适用于1panel自动证书申请

1.0 1panel 配置证书申请

KSnipaste_2025-01-10_12-29-51.jpg

1.1创建 Acme账户 和DNS账户

KSnipaste_2025-01-10_12-34-38.jpg

密钥算法和申请的私钥算法一致即可

ASnipaste_2025-01-10_12-40-04.jpg

创建 DNS 账户(自用的是阿里云的)

AAdsSnipaste_2025-01-10_13-15-29.jpg

VSnipaste_2025-01-10_13-17-47.jpg

创建完成后就可以申请证书了

1.2 申请证书

A_Snipaste_2025-01-10_13-33-08.jpg

选择执行项

AAASnipaste_2025-01-10_13-40-59.jpg

1.3 Backup_And_Replace.sh 脚本

#!/bin/bash
# 日志记录函数
log() {
#前景色(字体颜色):黑色(BK):30|红色(RD):31|绿色(GN):32|
#黄色(YW):33|蓝色(BE):34|紫色(PE):35|青色(CN):36|白色(WE):37 
    color=36
    if [ "$2" != "" ];then
        read_color="$2"
        if [ "$read_color" == "BK" ]; then
            color=30
        elif [ "$read_color" == "RD" ]; then
            color=31
        elif [ "$read_color" == "GN" ]; then
            color=32
        elif [ "$read_color" == "YW" ]; then
            color=33
        elif [ "$read_color" == "BE" ]; then
            color=34
        elif [ "$read_color" == "PE" ]; then
            color=35
        elif [ "$read_color" == "WE" ]; then
            color=36
        else
            color=37
        fi
    
    fi
    echo -e "\033[${color}m[$(date '+%Y-%m-%d %H:%M:%S')] $1\033[0m"
    #echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}

function Backup() {
   local FILE_NAME=$1
   local PREFIX_PATH=$2
   # 获取当前日期,格式为 年-月-日
   #DATE=$(date +%Y-%m-%d)
   local DATE=$3
   # 源文件路径
   local SOURCE_FILE="$PREFIX_PATH/$FILE_NAME"
    #判断文件是否存在(不管是文件还是目录)
    if [ -e "$SOURCE_FILE" ]; then
        log "${SOURCE_FILE}文件存在"
    else
        log "${SOURCE_FILE}文件不存在,请检查!备份终止!"
        exit # 检查备份目录是否存在,如果不存在则创建
    fi

   # 备份文件存储路径
   local BACKUP_DIR="$4"
   # 检查备份目录是否存在,如果不存在则创建
   if [ -d "$BACKUP_DIR" ]; then
        log "${BACKUP_DIR}文件夹存在"
   else
        log "${BACKUP_DIR}文件夹不存在,创建中..."
        mkdir -p "${BACKUP_DIR}"
        log "创建${BACKUP_DIR}文件夹成功"
   fi

   # 备份文件名,格式为 file-YYYY-MM-DD.txt
    local  BACKUP_FILE_TEMP="$BACKUP_DIR/${FILE_NAME}_Backup_$DATE"
    log "BACKUP_FILE_TEMP=$BACKUP_FILE_TEMP"

    if [ -e "$BACKUP_FILE_TEMP" ]; then
       log "${BACKUP_FILE_TEMP}文件存在,今日已经备份完成!"
    else
       log "开始备份 $SOURCE_FILE 到 $BACKUP_FILE_TEMP"
       # 进行备份操作
       cp "$SOURCE_FILE" "$BACKUP_FILE_TEMP"
       # 输出备份成功信息
       log "Backup of $SOURCE_FILE created as $BACKUP_FILE_TEMP"
    fi
}

function BackupAll() {
   local BACKUP_FILE_MAP=()
   local FILE_NAME_TEMP=$1
   local FILE_NAME2_TEMP=$2

   local DATE=$(date +%Y-%m-%d)
   local PREFIX_PATH=$3
   local BACKUP_DIR="$PREFIX_PATH/backup"
   #if [ -n "${domainName}" ]; then
   #  BACKUP_DIR="${BACKUP_DIR}/${domainName}" 
   #fi
   BACKUP_FILE_MAP+=("$BACKUP_DIR/${FILE_NAME_TEMP}_Backup_$DATE")
   BACKUP_FILE_MAP+=("$BACKUP_DIR/${FILE_NAME2_TEMP}_Backup_$DATE")

   Backup "$FILE_NAME_TEMP" "$PREFIX_PATH" "$DATE" "$BACKUP_DIR"
   Backup "$FILE_NAME2_TEMP" "$PREFIX_PATH" "$DATE" "$BACKUP_DIR"

   for element in "${BACKUP_FILE_MAP[@]}"; do
      if [ -e "$element" ]; then
          log "${element}文件存在,备份成功!"
      else
          log "${element}文件不存在,备份失败!退出后续操作" "RD"
          exit # 检查备份目录是否存在,如果不存在则创建
      fi
   done
}


function Replace() {
     local FILE_NAME_TEMP=$1
     local APPLY_FILE_NAME_TEMP=$2

     local SOURCE_FILE="$APPLY_FILE_NAME_TEMP"
     local TO_SOURCE_FILE="$FILE_NAME_TEMP"
     log "开始替换 $SOURCE_FILE 到 $TO_SOURCE_FILE"
     # 进行替换操作
     cp "$SOURCE_FILE" "$TO_SOURCE_FILE"
     #mv "$SOURCE_FILE" "${SOURCE_FILE}.ok"
     if [ $? -eq 0 ]; then
        mv "$SOURCE_FILE" "${SOURCE_FILE}.ok"
        log "复制 $SOURCE_FILE 到 $TO_SOURCE_FILE 成功" "GN"
     else
        log "复制 $SOURCE_FILE 失败" "RD"
        exit 1
     fi
     # 输出替换成功信息
     log "cp of $SOURCE_FILE to as $TO_SOURCE_FILE"
}

function ReplaceAll() {
   local PREFIX_PATH=$1
   local FILE_NAME=$2
   local APPLY_FILE_NAME=$3
   local FILE_NAME2=$4
   local APPLY_FILE_NAME2=$5

   Replace "$PREFIX_PATH/$FILE_NAME" "$PREFIX_PATH/$APPLY_FILE_NAME"
   Replace "$PREFIX_PATH/${FILE_NAME2}" "$PREFIX_PATH/${APPLY_FILE_NAME2}"

}

function main() {
  sleep 1
  local domain_name=$1
  local PREFIX_PATH=$2
  local DOCKER_NGINX_NANE=$3
  #新申请的ssl 和原ssl 要求处于同一目录
  #FILE_NAME="cloud-guest.top.key" #原私钥名(不带路径)
  #FILE_NAME2="cloud-guest.top.pem" #原证书名(不带路径)

  #if [ ! -n "${domain_name}" ]; then
  #  domain_name="cloud-guest.top"
  #fi
  if [ -z "${domain_name}" ]; then
    domain_name="cloud-guest.top"
    log "未提供域名参数,使用默认值 ${domain_name}" "YW"
  fi

  if [ -z "${PREFIX_PATH}" ]; then
     PREFIX_PATH="/docker-volumes/nginx/conf.d/cert" #证书所在目录
     log "未提供前缀参数,使用默认值 ${PREFIX_PATH}" "YW"
  fi

  if [ -z "${DOCKER_NGINX_NANE}" ]; then
     DOCKER_NGINX_NANE="nginx" #docker 容器名
     log "未提供nginx docker 容器名,使用默认值 ${DOCKER_NGINX_NANE}" "YW"
  fi


  log "domain_name ==> ${domain_name}"
  FILE_NAME="${domain_name}.key" #原私钥名(不带路径)
  FILE_NAME2="${domain_name}.pem" #原证书名(不带路径)
  PREFIX_PATH="${PREFIX_PATH}/${domain_name}" #证书所在目录


  APPLY_FILE_NAME="privkey.pem" #新申请的私钥名(不带路径)
  APPLY_FILE_NAME2="fullchain.pem" #新申请的证书名(不带路径)
  

  if [ ! -f "$PREFIX_PATH/$FILE_NAME" ]; then
    log "文件 $PREFIX_PATH/$FILE_NAME 不存在 开始创建"
    touch "$PREFIX_PATH/$FILE_NAME"
    if [ $? -eq 0 ]; then
        log "文件 $PREFIX_PATH/$FILE_NAME 创建成功" "GN"
    else
        log "文件 $PREFIX_PATH/$FILE_NAME 创建失败" "RD"
        exit 1
    fi
  fi

  if [ ! -f "$PREFIX_PATH/$FILE_NAME2" ]; then
    log "文件 $PREFIX_PATH/$FILE_NAME2 不存在 开始创建"
    touch "$PREFIX_PATH/$FILE_NAME2"
    if [ $? -eq 0 ]; then
        log "文件 $PREFIX_PATH/$FILE_NAME2 创建成功" "GN"
    else
        log "文件 $PREFIX_PATH/$FILE_NAME2 创建失败" "RD"
        exit 1
    fi
  fi

  log "================================================================"
  #备份 原证书 每天只备份一次 备份文件名:${FILE_NAME}_Backup_$DATE
  BackupAll "$FILE_NAME" "$FILE_NAME2" "$PREFIX_PATH"
  log "================================================================"
  #替换 原证书为 新证书 并将新证书命名为 ${APPLY_FILE_NAME}.ok
  ReplaceAll "$PREFIX_PATH" "$FILE_NAME" "$APPLY_FILE_NAME" "$FILE_NAME2" "$APPLY_FILE_NAME2"
  log "================================================================"
  log "重启nginx:${DOCKER_NGINX_NANE} 加载ssl"
  sudo docker restart ${DOCKER_NGINX_NANE}
  log "================================================================"
  log "等待10s nginx:${DOCKER_NGINX_NANE}重启完成"
  sleep 10
  # 检查容器是否正在运行
 sudo docker ps | grep -q "${DOCKER_NGINX_NANE}"
 RM_FILE_MAP=()
  if [ $? -eq 0 ]; then
      log "Nginx容器已经成功重启并正在运行。"
      log "正在移除 多余文件 ..."
      RM_FILE_MAP+=( "rm -rf $PREFIX_PATH/${APPLY_FILE_NAME}.ok" )
      RM_FILE_MAP+=( "rm -rf $PREFIX_PATH/${APPLY_FILE_NAME2}.ok" )

      for element in "${RM_FILE_MAP[@]}"; do
          log "${element} ==> runing..."
          eval ${element}
          if [ $? -eq 0 ]; then
            log "${element} ==> ok" "GN"
          else
            log "${element} ==> fail" "RD"
            #exit 1
          fi
      done
  else
      log "Nginx容器未能启动,请检查错误日志。" "RD"
      exit 1
  fi
}

domainName=$1
prefixPath=$2
dockerNginxName=$3
main "${domainName}" "${prefixPath}" "${dockerNginxName}"