https证书生成过程

319 阅读2分钟

参考链接 可以直接使用如下脚本生成最终的https证书:
调用方式:./certificate.sh -d my.knowdee.com 参数-d用来指定要生成证书的域名

#!/bin/bash
set -e
source ./attachment/script/log.sh
keys=( "-o","--output","-h","--help","-d","--domain","--clean")
POSITIONAL=()
while [[ $# -gt 0 ]]; do
  if [[ $1 == -* || $1 == --* ]]; then
    key="$1"
    if [[ ! "${keys[@]}"  =~ "${1}" ]]; then
      echo "Error! invalid flag: ${key}"
      help="true"
      break
    fi
    # echo "key:"$key"--------------------"
  fi
  if [[ $2 == -* || $2 == --* ]]; then
    shift
    # echo "continue:--------------------"
    continue
  fi
  case $key in
    -d|--domain)
      # echo "input:--------------------$2*******************"
      domain=${2:-$domain}
      shift # past argument
      ;;
    -o|--output)
      output=${2:-$output}
      shift # past argument
      ;;      
    -h|--help)
      help="true"
      shift
      ;;
    --clean)
      clean="true"
      shift
      ;;
    *)
      echo "Error! invalid flag: ${key}"
      help="true"
      break
      ;;
  esac
done

usage () {
        echo "USAGE: $0 [--skip data image] [--input /tmp] [--output ./output] [-h] [--clean]"
        echo "  [-k|--skip] "
        echo "     data : The process will skip the data resource download "
        echo "     image : The process will skip the image download "
        echo "  [-i|--input] The location of the k8s yaml graph file ;If multiple values, the last one works."
        echo "     1. The location of the k8s yaml graph file."
        echo "     2. default ./input"
        echo "     3. If multiple values, the last one works."
        echo "  [-o|--output] "
        echo "     1. The location of the generated install package"
        echo "     2. default ./output"
        echo "     3. If multiple values, the last one works."
        echo "  [--clean] clean tmp and output directory"
        echo "  [-h|--help] Usage message"
}

if [[ $help ]]; then
        usage
        exit 0
fi
domain=${domain:-"$domain"}
output=${output:-"./output"}
if [[ $clean ]]; then
  Log INFO "清理输出目录$output/*和临时目录./tmp"
  rm -rf ./tmp $output/*
  exit 0
fi
Log INFO "1. 生成证书颁发机构证书"
Log INFO "  1.1 生成CA证书私钥"
openssl genrsa -out $output/ca.key 4096
Log INFO "  1.2 生成CA证书"
Log INFO "    1.2.1. 调整-subj选项中的值以反映您的组织。如果使用FQDN连接Harbor主机,则必须将其指定为通用名称(CN)属性"
Log INFO "    1.2.2. 如果是ip访问, 将 $domain 改成 ip地址"
openssl req -x509 -new -nodes -sha512 -days 3650  -subj "/C=CN/ST=Beijing/L=Beijing/O=knowdee/OU=yw/CN=$domain"  -key $output/ca.key  -out $output/ca.crt
Log INFO "2. 生成服务器证书"
Log INFO "  2.1 生成私钥"
openssl genrsa -out $output/$domain.key 4096
Log INFO "  2.2 生成证书签名请求(CSR)"
openssl req -sha512 -new     -subj "/C=CN/ST=Beijing/L=Beijing/O=knowdee/OU=yw/CN=$domain"     -key $output/$domain.key     -out $output/$domain.csr
Log INFO "  2.3 生成一个x509 v3扩展文件"
#无论您使用FQDN还是IP地址连接到Harbor主机,都必须创建此文件,以便可以为您的Harbor主机生成符合主题备用名称(SAN)和x509 v3的证书扩展要求。替换DNS条目以反映您的域
cat > $output/v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=$domain
DNS.2=images.knowdee.com
EOF

# 如果是ip访问
# Copy
# cat > v3.ext <<-EOF
# authorityKeyIdentifier=keyid,issuer
# basicConstraints=CA:FALSE
# keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
# extendedKeyUsage = serverAuth
# subjectAltName = IP:192.168.31.200
# EOF
Log INFO "  2.4 使用该v3.ext文件为您的Harbor主机生成证书"
#生成后ca.crt,harbor.od.com.crt和harbor.od.com.key文件,必须将它们提供给Harbor和docker,重新配置它们
openssl x509 -req -sha512 -days 3650     -extfile $output/v3.ext     -CA $output/ca.crt -CAkey $output/ca.key -CAcreateserial     -in $output/$domain.csr     -out $output/$domain.crt
Log INFO "  3.2 转换harbor.od.com.crt为harbor.od.com.cert,供Docker使用"
#Docker守护程序将.crt文件解释为CA证书,并将.cert文件解释为客户端证书
openssl x509 -inform PEM -in $output/$domain.crt -out $output/$domain.cert    
# cp ca.crt $domain.cert $domain.key /etc/docker/certs.d/$domain

log.sh内容如下:

#!/bin/bash
function Log(){
        local log_level=$1
        local log_info=$2
        local line=$3
        local script_name=$(basename $0)

        case ${log_level} in
        "INFO")
                echo -e "\033[32m$(date "+%Y-%m-%d %T.%N") [INFO]: ${log_info}\033[0m";;
        "WARN")
                echo -e "\033[33m$(date "+%Y+%m+%d %T.%N") [WARN]: ${log_info}\033[0m";;
        "ERROR")
                echo -e "\033[31m$(date "+%Y-%m-%d %T.%N") [ERROR ${script_name} ${FUNCNAME[1]}:$line]: ${log_info}\033[0m";;

        *)
                echo -e "${@}"
        ;;
        esac
}