#!/usr/bin/env bash # 生成内网专用 CA 与服务器证书(自受管内部信任,不涉及公网域名)。 # 用法:在正式环境 deploy/ 目录执行 ./tls/gen-cert.sh # 可用环境变量覆盖: # CERT_IP 对外访问 IP(默认 192.168.200.36) # CERT_DNS 额外 DNS 名称(空格分隔,默认 caiwuzongzhang.jinniu.internal) # 输出:tls/certs/{ca.crt,ca.key,server.crt,server.key}(key 永不入库、不分发) # 分发:仅把 ca.crt 发给公司电脑安装(受信任的根证书颁发机构)。 set -euo pipefail ROOT="$(cd "$(dirname "$0")" && pwd)" CERTS="$ROOT/certs" mkdir -p "$CERTS" cd "$CERTS" CERT_IP="${CERT_IP:-192.168.200.36}" CERT_DNS="${CERT_DNS:-caiwuzongzhang.jinniu.internal}" SAN="IP:${CERT_IP}" for d in $CERT_DNS; do SAN="$SAN,DNS:$d"; done if [[ ! -f ca.key ]]; then # 内部根 CA:10 年,仅本系统使用 openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:P-256 \ -keyout ca.key -out ca.crt -days 3650 -nodes -subj "/CN=Jinniu Ledger Internal CA" \ -addext "basicConstraints=critical,CA:TRUE" \ -addext "keyUsage=critical,keyCertSign,cRLSign" chmod 600 ca.key echo "ca 已生成" fi openssl req -newkey ec -pkeyopt ec_paramgen_curve:P-256 \ -keyout server.key -out server.csr -nodes \ -subj "/CN=${CERT_DNS%% *}" >/dev/null 2>&1 cat > server.ext </dev/null 2>&1 chmod 600 server.key rm -f server.csr server.ext ca.srl echo "server 证书已生成(SAN: ${SAN}),有效期 5 年" echo "分发文件:${CERTS}/ca.crt(其余文件不得离开本机)"