本项目用于在本地/内网场景中自动化完成证书相关工作:
- 生成根 CA
- 生成服务器证书(支持 DNS/IP SAN)
- 合并为 PEM
- 安装 CA 到 Debian
- 导入 CA 到 Windows
当前脚本遵循统一风格:
- 默认读取
cert_config.env - 支持命令行参数覆盖(
--help可查看) - 日志输出到
stderr - 结果输出到
stdout(KEY=VALUE),便于管道组合
cert_config.env:统一配置入口script_lib.sh:公共函数(加载配置、路径处理、日志)create_root_ca.sh:只做一件事,生成根 CAcreate_server_cert.sh:只做一件事,生成/签发服务器证书cert2pem.sh:只做一件事,合并 CRT+KEY 为 PEMinstall_cert_debian.sh:只做一件事,安装 CA 到 Debian 信任库win_import_cert_run_as admin.bat:只做一件事,导入 CA 到 Windows 证书库ca-server-https-setup.md:扩展参考文档
- 安装 OpenSSL。
- Linux/macOS 确保可执行权限:
chmod +x create_root_ca.sh create_server_cert.sh cert2pem.sh install_cert_debian.sh- 编辑配置文件:
cert_config.env。
常用配置项(完整项见 cert_config.env):
- 根 CA:
ROOT_CA_* - 服务器证书:
SERVER_* - 输出目录:
CERT_OUTPUT_DIR - Debian 安装:
DEBIAN_* - PEM 合并:
PEM_* - Windows 导入:
WIN_*
建议先只改这几项:
CERT_OUTPUT_DIRROOT_CA_NAME、ROOT_CNSERVER_CERT_NAME、SERVER_CNSERVER_DNS_1(至少一个 SAN)
./create_root_ca.sh期望 stdout(示例):
ROOT_KEY_PATH=/abs/path/ROOT_CA.key
ROOT_CSR_PATH=/abs/path/ROOT_CA.csr
ROOT_CRT_PATH=/abs/path/ROOT_CA.crt
./create_server_cert.sh期望 stdout(示例):
SERVER_KEY_PATH=/abs/path/server.example.internal.key
SERVER_CSR_PATH=/abs/path/server.example.internal.csr
SERVER_CRT_PATH=/abs/path/server.example.internal.crt
SERVER_EXT_PATH=/abs/path/server.example.internal.ext
./cert2pem.sh期望 stdout(示例):
PEM_PATH=/abs/path/server.example.internal.pem
sudo ./install_cert_debian.sh期望 stdout(示例):
INSTALLED_CERT_NAME=ROOT_CA.crt
INSTALLED_CERT_PATH=/abs/path/ROOT_CA.crt
管理员命令行运行:
win_import_cert_run_as admin.bat期望 stdout(示例):
WIN_CERT_PATH=C:\path\ROOT_CA.crt
WIN_CERT_STORE=Root
./create_root_ca.sh --config /tmp/my_cert_config.env./create_server_cert.sh --out-dir /tmp/certs./create_server_cert.sh \
--name api.example.internal \
--cn api.example.internal \
--dns api.example.internal \
--dns alt-api.example.internal \
--ip 203.0.113.20./cert2pem.sh \
--crt /tmp/certs/api.example.internal.crt \
--key /tmp/certs/api.example.internal.key \
--out /tmp/certs/api.example.internal.pemeval "$(./create_server_cert.sh)"
./cert2pem.sh --crt "$SERVER_CRT_PATH" --key "$SERVER_KEY_PATH"./create_server_cert.sh | awk -F= '/^SERVER_CRT_PATH=/{print $2}'-
No SAN entries found原因:没有提供SERVER_DNS_*或SERVER_IP_*,且未通过--dns/--ip传参。 -
CA files not found原因:未先执行create_root_ca.sh,或ROOT_CA_*文件名/输出目录不一致。 -
Debian 安装失败 原因:需要 root 权限;请使用
sudo,并检查DEBIAN_*路径配置。 -
Windows 导入失败 原因:未以管理员权限运行,或
WIN_CA_CERT_FILE路径错误。
- 当前仓库配置均为占位值,请勿填入真实敏感信息后直接提交。
- 严禁提交真实私钥(
.key)与生产证书。 - 建议把证书产物目录加入
.gitignore。 - 根 CA 私钥应单独受控保存,避免放在共享目录。
Config-driven certificate automation with simple UNIX-style scripts:
create_root_ca.shcreate_server_cert.shcert2pem.shinstall_cert_debian.shwin_import_cert_run_as admin.bat
All scripts:
- read
cert_config.envby default - support CLI overrides (
--help) - log to
stderr - print machine-friendly
KEY=VALUEtostdout
./create_root_ca.sh
./create_server_cert.sh
./cert2pem.sh
# optional
sudo ./install_cert_debian.sh./create_root_ca.sh --config /tmp/my.env
./create_server_cert.sh --out-dir /tmp/certs --dns api.example.internal --ip 203.0.113.20
./cert2pem.sh --crt /tmp/certs/api.example.internal.crt --key /tmp/certs/api.example.internal.keyeval "$(./create_server_cert.sh)"
./cert2pem.sh --crt "$SERVER_CRT_PATH" --key "$SERVER_KEY_PATH"- Do not commit real private keys or production certs.
- Keep CA private keys in a protected location.
- Prefer placeholders in shared config/docs.