#!/bin/bash
# 颜色定义
RED='\033[41;30m'
GREEN='\033[42;30m'
NC='\033[0m'

# 定义目录
DOMAIN="${1:-test.klquan.com}"
home="/tmp"
SCRIPT_DIR="$home/cfssl"
OUTPUT_DIR="$home/${DOMAIN}"
mkdir -p "$OUTPUT_DIR"

# 定义执行结果检查函数
check(){
    if [ $? -eq 0 ]; then
        echo -e "    ····${GREEN}执行成功${NC}"
    else
        echo -e "    ····${RED}操作失败，退出执行${NC}"
        exit 5
    fi
}

# 确认信息
    echo -e "确认安装信息，如需修改在倒计时结束前[ctrl+C]终止，10秒不操作自动执行"
    echo -e "确认域名 ${GREEN}【$DOMAIN/】${NC}"
    echo -e "存放目录 ${GREEN}【$OUTPUT_DIR/】${NC}"
    echo -e "如需更改 ${GREEN}【curl -sSL https://www.klquan.com/scripts/tools/built_certs.sh | bash -s -- ${RED}www.1234.com${GREEN}】${NC}"
    echo "[倒计时-10]     _  _                                           " && sleep 1
    echo "[倒计时-09]    | |(_) _ __    __ _   __ _  _   _   __ _  _ __  " && sleep 1
    echo "[倒计时-08]    | || || '_ \  / _' | / _' || | | | / _' || '_ \ " && sleep 1
    echo "[倒计时-07]    | || || | | || (_| || (_| || |_| || (_| || | | |" && sleep 1
    echo "[倒计时-06]    |_||_||_| |_| \__, | \__, | \__,_| \__,_||_| |_|" && sleep 1
    echo "[倒计时-05]                  |___/     |_|                     " && sleep 1
    echo '[倒计时-04]    脚本作者：[孔令泉], 如有疑问请联系lqkong0189@163.com' && sleep 1
    echo '[倒计时-03]    官网连接：www.klquan.com;www.klquan.cn' && sleep 1
    echo '[倒计时-02]' && sleep 1
    echo '[倒计时-01]' && sleep 1


# 安装过程
echo "【1】下载并且解压cfssl工具包"
curl -L -o "$home/cfssl.tar.gz" -# "https://www.klquan.com/packages/cfssl.tar.gz"
cd "$home"
tar xf "cfssl.tar.gz" && rm -f "cfssl.tar.gz"
chmod -R +x cfssl
check

echo "【2】生成 CA 根证书"
# 生成 CA 配置文件
cat > "${OUTPUT_DIR}/ca-config.json" <<EOF
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "kubernetes": {
         "expiry": "87600h",
         "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ]
      }
    }
  }
}
EOF
# 生成 CA 证书签名请求配置
cat > "${OUTPUT_DIR}/ca-csr.json" <<EOF
{
    "CN": "kubernetes",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "ST": "Beijing"
        }
    ]
}
EOF
# 生成 CA 根证书（隐藏 stderr 日志）
"${SCRIPT_DIR}/cfssl" gencert -initca "${OUTPUT_DIR}/ca-csr.json" 2>/dev/null | "${SCRIPT_DIR}/cfssljson" -bare "${OUTPUT_DIR}/ca"
check

echo "【3】 签发 ${DOMAIN} 证书"
# 生成服务器证书签名请求配置
cat > "${OUTPUT_DIR}/${DOMAIN}-csr.json" <<EOF
{
  "CN": "${DOMAIN}",
  "hosts": ["${DOMAIN}"],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "L": "BeiJing",
      "ST": "BeiJing"
    }
  ]
}
EOF
# 使用 CA 签发服务器证书（隐藏 stderr 日志）
"${SCRIPT_DIR}/cfssl" gencert \
  -ca="${OUTPUT_DIR}/ca.pem" \
  -ca-key="${OUTPUT_DIR}/ca-key.pem" \
  -config="${OUTPUT_DIR}/ca-config.json" \
  -profile=kubernetes \
  "${OUTPUT_DIR}/${DOMAIN}-csr.json" \
  2>/dev/null | "${SCRIPT_DIR}/cfssljson" -bare "${OUTPUT_DIR}/${DOMAIN}"
check

echo "【4】 删除中间垃圾文件"
rm -rf $SCRIPT_DIR
# 定义证书用途、有效期等，签发证书时读取
rm -f ${OUTPUT_DIR}/ca-config.json
# 生成根证书过程中的中间产物，证书生成后无用
rm -f ${OUTPUT_DIR}/ca.csr
# 仅用于生成根证书，完成后不再需要
rm -f ${OUTPUT_DIR}/ca-csr.json
# 发送给CA签名的中间文件，签发完成后无用
rm -f ${OUTPUT_DIR}/${DOMAIN}.csr
# 仅用于生成CSR，完成后不再需要
rm -f ${OUTPUT_DIR}/${DOMAIN}-csr.json
check

echo "【完成】路径在$OUTPUT_DIR下，有效期10年"
echo "    ····根证书（公钥）:${OUTPUT_DIR}/ca.pem"
echo "    ····根证书（私钥）:${OUTPUT_DIR}/ca-key.pem"
echo "    ····域名证书（公钥）:${OUTPUT_DIR}/${DOMAIN}.pem"
echo "    ····域名证书（私钥）:${OUTPUT_DIR}/${DOMAIN}-key.pem"
echo "【nginx配置示例】路径在$OUTPUT_DIR下，有效期10年"
echo "    server_name ${DOMAIN};"
echo "    ssl_certificate ${DOMAIN}.pem;"
echo "    ssl_certificate_key ${DOMAIN}-key.pem;"

