1
This commit is contained in:
78
scripts/ensure-dummy-certs.sh
Normal file
78
scripts/ensure-dummy-certs.sh
Normal file
@@ -0,0 +1,78 @@
|
||||
#!/usr/bin/env sh
|
||||
set -eu
|
||||
|
||||
# 为缺失证书的域名生成临时 dummy 证书。
|
||||
# 已有完整正式证书时直接跳过,不覆盖线上可用证书。
|
||||
|
||||
ROOT_DIR="$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)"
|
||||
CERT_ROOT="${CERT_ROOT:-./certs/live}"
|
||||
|
||||
cd "$ROOT_DIR"
|
||||
|
||||
if [ -z "${DOMAINS:-}" ]; then
|
||||
echo "错误:必须设置 DOMAINS。" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! command -v openssl >/dev/null 2>&1; then
|
||||
echo "错误:缺少 openssl 命令。" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
for domain in $DOMAINS; do
|
||||
cert_dir="$CERT_ROOT/$domain"
|
||||
cert_file="$cert_dir/fullchain.pem"
|
||||
key_file="$cert_dir/privkey.pem"
|
||||
marker_file="$cert_dir/.dummy-init-certs"
|
||||
tmp_cert_file="$cert_file.tmp"
|
||||
tmp_key_file="$key_file.tmp"
|
||||
|
||||
mkdir -p "$cert_dir"
|
||||
|
||||
if [ -f "$cert_file" ] && [ -f "$key_file" ]; then
|
||||
if [ -f "$marker_file" ]; then
|
||||
# 上一次脚本可能中途失败,留下了 dummy 证书。
|
||||
# 继续把它当作 dummy 处理,后面会删除并重新申请正式证书。
|
||||
echo "复用已存在的 dummy 证书:$domain" >&2
|
||||
echo "$domain"
|
||||
continue
|
||||
fi
|
||||
|
||||
# 已经有正式证书时不覆盖,避免误删线上可用证书。
|
||||
echo "跳过已存在的正式证书:$domain" >&2
|
||||
continue
|
||||
fi
|
||||
|
||||
if [ -f "$cert_file" ] || [ -f "$key_file" ]; then
|
||||
if [ -f "$marker_file" ]; then
|
||||
# 上次生成 dummy 证书时可能中途退出,留下了不完整文件。
|
||||
# 这些文件由本脚本创建,可以安全清理后重建。
|
||||
echo "清理不完整的 dummy 证书:$domain" >&2
|
||||
rm -f "$cert_file" "$key_file" "$marker_file" "$tmp_cert_file" "$tmp_key_file"
|
||||
else
|
||||
# 只存在证书或只存在私钥,状态不完整。
|
||||
# 自动处理可能误删用户文件,所以直接停止,让用户手工确认。
|
||||
echo "错误:$domain 存在不完整的证书文件,请手动检查目录:$cert_dir" >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -f "$cert_file" ] && [ ! -f "$key_file" ]; then
|
||||
# marker 先创建,避免 openssl 成功后脚本中断时留下无 marker 的 dummy 文件。
|
||||
rm -f "$tmp_cert_file" "$tmp_key_file"
|
||||
: > "$marker_file"
|
||||
|
||||
echo "创建 dummy 证书:$domain" >&2
|
||||
if ! openssl req -x509 -nodes -newkey rsa:2048 -days 1 \
|
||||
-keyout "$tmp_key_file" \
|
||||
-out "$tmp_cert_file" \
|
||||
-subj "/CN=$domain"; then
|
||||
rm -f "$tmp_cert_file" "$tmp_key_file" "$marker_file"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mv -f "$tmp_key_file" "$key_file"
|
||||
mv -f "$tmp_cert_file" "$cert_file"
|
||||
echo "$domain"
|
||||
fi
|
||||
done
|
||||
Reference in New Issue
Block a user