From 53d2f55c21112e3503b23458028529e7abda2f71 Mon Sep 17 00:00:00 2001 From: xking Date: Wed, 30 Jul 2025 21:09:30 +0800 Subject: [PATCH] update ca --- 私有CA.md | 204 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 203 insertions(+), 1 deletion(-) diff --git a/私有CA.md b/私有CA.md index 06645db..d6d3d64 100644 --- a/私有CA.md +++ b/私有CA.md @@ -209,4 +209,206 @@ curl --cacert ca.pem https://server.example.com - 如需撤销证书,可使用CFSSL生成证书撤销列表(CRL) - 更新 `ca-config.json` 添加CRL配置 -通过以上步骤,你已成功创建了一个有效期10年的私有CA,并使用它签署了服务器和客户端证书。 \ No newline at end of file +通过以上步骤,你已成功创建了一个有效期10年的私有CA,并使用它签署了服务器和客户端证书。 + +### 八、附快速签发脚本 + + +```bash +#!/bin/bash + +# 证书快速签发脚本 +# 依赖: cfssl, cfssljson 已安装并初始化好CA证书 + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[0;33m' +NC='\033[0m' # No Color + +# 默认配置 +CA_KEY="/root/ckw/cfssl/ca/ca-ecdsa-key.pem" +CA_CERT="/root/ckw/cfssl/ca/ca-ecdsa.pem" +CA_CONFIG="/root/ckw/cfssl/ca/ca-config.json" +OUTPUT_DIR="certs" +MERGE_CA="true" # 默认合并根证书 + +# 使用帮助 +function show_help { + echo -e "${GREEN}证书快速签发脚本${NC}" + echo "用法: $0 [选项]" + echo "选项:" + echo " -h, --help 显示此帮助信息" + echo " -n, --name NAME 证书名称 (必填)" + echo " -t, --type TYPE 证书类型: server, client, peer (默认: server)" + echo " -c, --ca CA_CERT CA证书路径 (默认: $CA_CERT)" + echo " -k, --ca-key CA_KEY CA私钥路径 (默认: $CA_KEY)" + echo " -C, --ca-config CONF CA配置文件路径 (默认: $CA_CONFIG)" + echo " -o, --output DIR 输出目录 (默认: $OUTPUT_DIR)" + echo " -d, --domains LIST 域名列表 (逗号分隔)" + echo "" + echo "示例:" + echo " $0 -n server1 -d example.com,www.example.com " +} + +# 参数解析 +NAME="" +TYPE="server" +DOMAINS="" + +while [[ $# -gt 0 ]]; do + case $1 in + -h|--help) + show_help + exit 0 + ;; + -n|--name) + NAME="$2" + shift 2 + ;; + -t|--type) + TYPE="$2" + shift 2 + ;; + -c|--ca) + CA_CERT="$2" + shift 2 + ;; + -k|--ca-key) + CA_KEY="$2" + shift 2 + ;; + -C|--ca-config) + CA_CONFIG="$2" + shift 2 + ;; + -o|--output) + OUTPUT_DIR="$2" + shift 2 + ;; + -d|--domains) + DOMAINS="$2" + shift 2 + ;; + --no-merge-ca) + MERGE_CA="false" + shift + ;; + *) + echo -e "${RED}未知参数: $1${NC}" >&2 + show_help + exit 1 + ;; + esac +done + +# 验证必填参数 +if [[ -z "$NAME" ]]; then + echo -e "${RED}错误: 必须指定证书名称 (-n/--name)${NC}" >&2 + show_help + exit 1 +fi + +# 验证证书类型 +if [[ "$TYPE" != "server" && "$TYPE" != "client" && "$TYPE" != "peer" ]]; then + echo -e "${RED}错误: 证书类型必须是 server, client 或 peer${NC}" >&2 + exit 1 +fi + +# 验证文件是否存在 +for file in "$CA_CERT" "$CA_KEY" "$CA_CONFIG"; do + if [[ ! -f "$file" ]]; then + echo -e "${RED}错误: 文件 $file 不存在${NC}" >&2 + exit 1 + fi +done + +# 当类型为server且未指定域名时,默认将name作为域名 +if [[ "$TYPE" == "server" && -z "$DOMAINS" ]]; then + DOMAINS="$NAME" + echo -e "${YELLOW}注意: 证书类型为server且未指定域名,默认添加 ${NAME} 作为域名${NC}" +fi + + +# 创建证书单独目录 +CERT_DIR="$OUTPUT_DIR/$NAME" +mkdir -p "$CERT_DIR" || { echo -e "${RED}无法创建证书目录: $CERT_DIR${NC}"; exit 1; } + +# 生成证书签名请求配置 +CSR_CONFIG="$CERT_DIR/${NAME}-csr.json" +cat > "$CSR_CONFIG" < "$FULL_CHAIN" + echo -e "${GREEN}合并后的完整证书链: ${FULL_CHAIN}${NC}" + fi + + # 显示证书信息 + echo -e "\n${YELLOW}证书信息:${NC}" + openssl x509 -noout -text -in "$CERT_DIR/${NAME}.pem" | grep -A 5 "Subject Alternative Name" +else + echo -e "${RED}证书生成失败!${NC}" + exit 1 +fi + +``` \ No newline at end of file