# 自签三级证书管理脚本 **Repository Path**: CZXyee/CA-Management-3 ## Basic Information - **Project Name**: 自签三级证书管理脚本 - **Description**: 自签三级证书管理脚本 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-03 - **Last Updated**: 2025-11-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 自签三级证书管理脚本 一个基于Python的自签X.509证书管理脚本,支持生成完整的三级证书链:根CA → 中间CA → 服务器证书。 ## 📋 功能特性 - **三级证书架构**:根CA → 中间CA → 服务器证书 - **批量生成**:支持同时生成多个中间CA和服务器证书 - **分别生成**:支持单独生成根CA、中间CA或服务器证书 - **部分配置**:支持配置文件只包含部分字段,灵活管理证书生成 - **完整证书链**:自动生成包含服务器证书、中间CA和根CA的完整证书链文件(fullchain) - **配置化管理**:通过JSON配置文件管理所有证书参数 - **密码保护**:支持为CA私钥设置密码保护 - **SAN扩展**:支持DNS名称和IP地址的Subject Alternative Name (SAN)扩展 - **规范证书扩展**:包含KeyUsage、ExtendedKeyUsage、BasicConstraints等标准X.509扩展 - **依赖检查**:自动检查生成中间CA和服务器证书所需的父证书文件是否存在 ## 🔧 系统要求 - Python 3.7+ - cryptography 库 ## 📦 安装依赖 ```bash pip install cryptography ``` ## 🚀 快速开始 ### 1. 准备配置文件 在 `configs/` 目录下创建或修改JSON配置文件。可以参考 `configs/test.json` 作为模板。 **配置文件支持完整配置或部分配置:** - **完整配置**:包含 `root_ca`、`intermediate_ca`、`server_cert` 所有字段 - **部分配置**:可以只包含需要的字段,例如只包含 `root_ca` 用于生成根CA ### 2. 生成证书链 ```bash # 生成配置文件中的所有证书类型(自动检测) python main.py configs/test.json # 只生成根 CA python main.py configs/test.json --root-ca # 只生成中间 CA python main.py configs/test.json --intermediate-ca # 只生成服务器证书 python main.py configs/test.json --server-cert # 组合生成(例如:生成根 CA 和服务器证书) python main.py configs/test.json --root-ca --server-cert ``` ### 3. 查看生成的证书 所有证书将按照配置文件中的 `root_path` 路径生成,默认结构如下: ``` CA/test/ ├── root/ │ ├── private/ │ │ └── rootCA.key # 根CA私钥(加密) │ └── certs/ │ └── rootCA.crt # 根CA证书 ├── intermediate/ │ ├── private/ │ │ ├── intermediateCA_dev.key │ │ └── intermediateCA_pro.key │ └── certs/ │ ├── intermediateCA_dev.crt │ └── intermediateCA_pro.crt └── server/ ├── private/ │ ├── server_dev.key │ └── server_pro.key └── certs/ ├── server_dev.crt ├── server_pro.crt ├── fullchain_dev.pem # 完整证书链(服务器+中间CA+根CA) └── fullchain_pro.pem ``` ## 📝 配置文件说明 配置文件采用JSON格式,包含以下主要部分: ### 顶层配置 ```json { "root_path": "CA/test", // 证书输出根路径(必需) "root_ca": { ... }, // 根CA配置(可选) "intermediate_ca": [ ... ], // 中间CA配置列表(可选,可多个) "server_cert": [ ... ] // 服务器证书配置列表(可选,可多个) } ``` **注意**: - `root_path` 是必需字段 - `root_ca`、`intermediate_ca`、`server_cert` 都是可选字段 - 如果配置文件只包含部分字段,程序会自动识别并只生成相应的证书 - 使用命令行选项(`--root-ca`、`--intermediate-ca`、`--server-cert`)可以覆盖自动检测行为 ### 根CA配置 (root_ca) ```json { "output_dir": "root", "key_path": "root/private/rootCA.key", "crt_path": "root/certs/rootCA.crt", "password": "your_password", // 私钥密码 "country_name": "CN", "state_or_province_name": "Your Province", "locality_name": "Your Locality", "organization_name": "Your Organization", "common_name": "Your Organization Root CA", "days": 36500, // 有效期(天数) "key_size": 4096 } ``` ### 中间CA配置 (intermediate_ca) ```json { "root_key_path": "root/private/rootCA.key", "root_crt_path": "root/certs/rootCA.crt", "root_password": "root_password", "password": "intermediate_password", "output_dir": "intermediate", "key_path": "intermediate/private/intermediateCA.key", "crt_path": "intermediate/certs/intermediateCA.crt", "country_name": "CN", "state_or_province_name": "Your Province", "locality_name": "Your Locality", "organization_name": "Your Organization", "common_name": "Your Organization Intermediate CA", "days": 1825, "key_size": 4096 } ``` ### 服务器证书配置 (server_cert) ```json { "inter_key_path": "intermediate/private/intermediateCA.key", "inter_crt_path": "intermediate/certs/intermediateCA.crt", "inter_password": "intermediate_password", "root_crt_path": "root/certs/rootCA.crt", "output_dir": "server", "key_path": "server/private/server.key", "crt_path": "server/certs/server.crt", "fullchain": "server/certs/fullchain.pem", // 完整证书链文件 "country_name": "CN", "state_or_province_name": "Your Province", "locality_name": "Your Locality", "organization_name": "Your Organization", "common_name": "localhost", "dns_names": ["localhost", "example.com"], // DNS名称列表 "ip_addrs": ["127.0.0.1", "::1"], // IP地址列表 "days": 825, "key_size": 2048 } ``` ## 📚 证书结构说明 ### 证书层级 ``` 根CA (Root CA) ├── 私钥:4096位RSA,密码保护,长度可配置 ├── 有效期:通常最长(如100年) ├── path_length: 1(允许签发中间CA) └── 用途:keyCertSign, crlSign 中间CA (Intermediate CA) ├── 私钥:4096位RSA,密码保护,长度可配置 ├── 有效期:中等(如5年) ├── path_length: 0(不允许再签发CA) ├── 用途:keyCertSign, crlSign └── ExtendedKeyUsage: ANY_EXTENDED_KEY_USAGE 服务器证书 (Server Certificate) ├── 私钥:2048位RSA,无密码保护(便于服务器使用,长度可配置) ├── 有效期:较短(如2-3年) ├── path_length: None(终端证书) ├── 用途:digitalSignature, keyEncipherment ├── ExtendedKeyUsage: serverAuth, clientAuth └── SAN:DNS名称和IP地址列表 ``` ### 证书链文件 (fullchain.pem) `fullchain.pem` 文件包含完整的证书链,格式为: ``` -----BEGIN CERTIFICATE----- [服务器证书] -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- [中间CA证书] -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- [根CA证书] -----END CERTIFICATE----- ``` 在TLS握手时,服务器应发送此完整证书链,客户端可以验证整个信任链。 ## ⚠️ 重要注意事项 ### 1. 中间CA重新生成 如果重新生成中间CA(使用新的密钥对),需要注意: - **证书链匹配**:服务器证书的 `AuthorityKeyIdentifier` (AKI) 指向签发它的中间CA的公钥标识符 - **TLS握手验证**:服务器发送的 `fullchain` 中,服务器证书的AKI必须与中间CA证书的 `SubjectKeyIdentifier` (SKI) 匹配 - **解决方案**: - 方案1:继续使用旧的中间CA证书(如果还在有效期内) - 方案2:重新生成所有使用该中间CA的服务器证书 ### 2. 私钥安全 - 根CA和中间CA的私钥都使用密码保护,请妥善保管密码 - 服务器证书的私钥不加密,便于服务器软件直接使用 - **生产环境**:请将私钥存储在安全的位置,设置适当的文件权限 ### 3. 证书有效期 - 根CA:建议设置较长的有效期(如50-100年) - 中间CA:建议5-10年 - 服务器证书:建议1-3年,便于定期轮换 ### 4. 路径配置 - 配置文件中的路径可以是相对路径(相对于 `root_path`)或绝对路径 - 所有输出路径会自动创建所需的目录结构 ### 5. 部分配置生成 当配置文件只包含部分字段时: - **自动检测**:如果不指定命令行选项,程序会根据配置文件中存在的字段自动决定生成什么 - **明确指定**:使用 `--root-ca`、`--intermediate-ca`、`--server-cert` 可以明确指定要生成的内容 - **依赖检查**:生成中间 CA 或服务器证书时,会自动检查所需的父证书文件是否存在,缺少时会报错提示 ## 🔍 使用方法示例 ### 基本使用 ```bash # 使用测试配置生成所有证书(自动检测配置文件中的字段) python main.py configs/test.json # 使用生产配置生成证书 python main.py configs/production.json ``` ### 分别生成不同类型的证书 ```bash # 只生成根 CA 证书 python main.py configs/my_test_root.json --root-ca # 只生成中间 CA 证书(需要先有根 CA) python main.py configs/my_test_intermediate.json --intermediate-ca # 只生成服务器证书(需要先有中间 CA 和根 CA) python main.py configs/my_test_server.json --server-cert # 组合生成:生成根 CA 和服务器证书(跳过中间 CA) python main.py configs/test.json --root-ca --server-cert ``` ### 部分配置示例 如果你有多个配置文件,每个只包含部分配置: ```bash # 配置文件1: 只包含 root_ca python main.py configs/root_only.json # 配置文件2: 只包含 intermediate_ca(引用配置文件1生成的根CA) python main.py configs/intermediate_only.json # 配置文件3: 只包含 server_cert(引用前面生成的CA) python main.py configs/server_only.json ``` ### 批处理脚本示例 Windows 批处理文件示例(`generate.bat`): ```batch python main.py configs/my_test_root.json python main.py configs/my_test_intermediate.json python main.py configs/my_test_server.json ``` 每个配置文件只包含相应的配置部分,可以分别管理。 ### 独立模块使用 如果需要单独生成某个层级的证书,可以直接调用对应的模块: ```python from make_root_ca import generate_root_ca from make_intermediate_ca import generate_intermediate_ca from make_server_cert import generate_server_cert # 生成根CA root_key, root_crt = generate_root_ca(root_ca_config, root_path) # 生成中间CA(需要根CA文件已存在) inter_key, inter_crt = generate_intermediate_ca(inter_config, root_path) # 生成服务器证书(需要中间CA和根CA文件已存在) server_key, server_crt, fullchain = generate_server_cert(server_config, root_path) ``` ### 命令行选项 ```bash python main.py [选项] 选项: --root-ca 仅生成根 CA 证书 --intermediate-ca 仅生成中间 CA 证书 --server-cert 仅生成服务器证书 如果不指定任何选项,会根据配置文件中的内容自动决定生成什么。 ``` ### 测试 ```bash python test_generate_ca.py ``` ## 📂 项目结构 ``` Solar Wind Technology/ ├── main.py # 主程序入口 ├── make_root_ca.py # 根CA生成模块 ├── make_intermediate_ca.py # 中间CA生成模块 ├── make_server_cert.py # 服务器证书生成模块 ├── config_types.py # 配置类型定义 ├── test_generate_ca.py # 测试脚本 ├── configs/ │ └── test.json # 示例配置文件 └── README.md # 本文档 ``` ## 🔐 安全建议 1. **密码管理**:使用强密码保护CA私钥,考虑使用密码管理器 2. **文件权限**:限制私钥文件的访问权限(仅所有者可读) 3. **备份**:定期备份根CA和中间CA的私钥 4. **密钥轮换**:定期轮换服务器证书 5. **存储安全**:生产环境私钥应存储在加密存储中 ## 📄 证书标准 本脚本生成的证书符合以下标准: - X.509 v3 - RFC 5280 (Certificate Profile) - RSA 密钥(根CA/中间CA: 4096位,服务器: 2048位,长度可配置) - SHA-256 签名算法 - PEM 编码格式 ## 📝 许可证 [MIT](./LICENSE) --- **⚠️ 警告**:本脚本生成的是自签名证书,主要用于开发和测试环境。生产环境建议使用由受信任CA签发的证书。 **Power By Cursor.**