Windows 自建 CA 服务器 运维手册

1. 系统概述

  • 产品名称:Windows Server 证书服务(Active Directory Certificate Services, AD CS)
  • 操作系统版本:Windows Server 2016 / 2019 / 2022(请确认)
  • CA 类型:企业根 CA / 企业从属 CA / 独立根 CA / 独立从属 CA(请勾选实际类型)
  • 部署位置:数据中心 / IP 地址:________________(请填写)
  • 主要功能

    • 证书颁发与管理(服务器证书、用户证书、代码签名证书等)
    • 证书模板管理(自定义证书类型和属性)
    • 证书吊销列表(CRL)发布与生命周期管理
    • 密钥存档与恢复(Key Archival & Recovery)
    • 基于策略的自动证书注册(Auto-Enrollment)
  • 服务对象

    • 域内计算机(计算机证书)
    • 域用户(用户证书、电子邮件加密)
    • IIS/Web 服务器(SSL/TLS 证书)
    • VPN/RADIUS 服务器(身份验证证书)
    • 代码签名(开发/发布签名证书)

2. 系统架构

2.1 组件组成

组件说明部署方式
根 CA(Root CA)证书链的信任锚点,通常离线保存物理机或虚拟机(离线)
从属 CA(Subordinate CA)实际签发证书的 CA,在线服务虚拟机
证书吊销列表(CRL)证书吊销状态发布与从属 CA 同服务器
AIA/CDP 发布点证书链和 CRL 分发地址Web 服务器(IIS)
CA Web 注册用户通过 Web 界面申请证书可选组件
网络设备注册服务(NDES)为路由器/交换机等非域设备颁发证书可选组件

2.2 网络拓扑

                    [根 CA(离线)]
                         ↑
                 手动导入 CA 证书
                         ↑
               [从属 CA(在线)]
                  /            \
          [IIS/AIA/CDP]    [AD + 组策略]
               |                 |
        [证书分发点]      [自动注册策略]
               |                 |
          [各客户端]        [域计算机/用户]

典型部署架构说明

  • 根 CA(离线):物理隔离,只在签发从属 CA 证书时开机
  • 从属 CA(在线):7×24 运行,负责日常证书签发
  • CRL 发布点:通常配置为 HTTP(IIS)和 LDAP(AD)
  • 证书注册方式:通过组策略自动注册(推荐)或手动 Web 申请

2.3 依赖关系

  • Active Directory:企业 CA 依赖 AD 发布证书模板和自动注册策略
  • DNS:解析 CA 服务器主机名和 CRL 分发点 URL
  • IIS:用于发布 CRL 和 AIA 的 Web 分发点
  • 组策略:配置证书自动注册策略
  • NTP:证书有效期的计算依赖于准确的系统时间
  • HSM(可选):硬件安全模块用于密钥保护

3. 日常运维操作

3.1 启动与停止

启动顺序

  1. 确保 AD 域控正常运行
  2. 启动从属 CA 服务器
  3. 确认 CA 服务(CertSvc)自动启动
  4. 确认 IIS(如启用 AIA/CDP)正常运行
  5. 检查证书服务状态

停止顺序

  1. 先停止 CA 服务(停止新证书签发)
  2. 确认无正在处理的证书请求后关闭系统

CA 服务管理

# 启动/停止/重启 CA 服务
net start certsvc
net stop certsvc
net restart certsvc

# 使用 PowerShell
Restart-Service CertSvc

# 查看服务状态
Get-Service CertSvc

3.2 服务状态检查

基本状态检查

# 检查 CA 服务是否运行
Get-Service CertSvc
# 预期输出:Running

# 检查 CA 配置信息
certutil -config

# 查看 CA 信息
certutil -CAInfo

# 查看 CA 签名证书信息
certutil -CATemplates

# 检查 CA 数据库状态
certutil -crl

证书颁发统计

# 查看已颁发的证书数量
certutil -view -out "Request.RequesterName, Certificate.ExpirationDate, Certificate.SerialNumber" -restrict "Request.StatusCode=3" | more

# 查看待处理的证书请求
certutil -view -out "RequestID, RequesterName, Request.RequestType" -restrict "Request.StatusCode=1"

# 查看已吊销的证书
certutil -view -out "RequestID, SerialNumber, RevocationDate" -restrict "Revocation.Reason<>0"

CRL 状态检查

# 查看当前 CRL
certutil -crl

# 查看 CRL 有效期
certutil -CRLInfo

# 检查 CRL 分发点
certutil -GetReg ca\CACRLPublicationURLs
certutil -GetReg ca\CACertPublicationURLs

3.3 日志查看

关键日志位置

日志/文件路径说明
CA 数据库%SystemRoot%\System32\CertLog\证书颁发日志
CA 策略模块日志%SystemRoot%\System32\CertLog*.edb数据库文件
事件查看器 - 应用程序Event Viewer → Applications and Services Logs → Microsoft → Windows → CertificateServicesCA 操作事件
事件查看器 - 系统Event Viewer → Windows Logs → System系统相关事件
IIS 日志%SystemRoot%\System32\LogFiles\W3SVC1\CRL 下载请求日志

查看 CA 事件日志

# 查看 CA 服务事件日志
Get-WinEvent -LogName "Microsoft-Windows-CertificateServices-Client-Lifecycle-System/Operational" -MaxEvents 50

# 查看 CA 管理事件
Get-WinEvent -LogName "Microsoft-Windows-CertificateServices-Deployment/Operational" -MaxEvents 50

# 查看最近 24 小时的错误事件
Get-WinEvent -LogName "Microsoft-Windows-CertificateServices-Client-Lifecycle-System/Operational" |
  Where-Object { $_.LevelDisplayName -eq "Error" -and $_.TimeCreated -gt (Get-Date).AddDays(-1) }

查看证书请求日志

# 查看最近 50 条证书请求
certutil -view -restrict "Request.RequestStatusCode=3" -out "RequestID, RequesterName, Certificate.NotBefore, Certificate.NotAfter" | more

3.4 性能监控

关键监控指标

指标说明告警阈值
CA 服务运行状态CertSvc 是否在运行非 Running 即告警
待处理请求队列等待签发的请求数> 10 持续 1 小时
证书有效期剩余CA 根证书和从属 CA 证书的到期时间< 180 天
CRL 更新时间下一次 CRL 发布剩余时间< 7 天
磁盘空间CA 数据库和日志所在盘> 85%
系统时间准确度NTP 同步状态偏差 > 5 分钟

监控命令

# 检查证书有效期
certutil -CAInfo | findstr /i "expiration"

# 检查 CA 数据库大小
Get-ChildItem "C:\Windows\System32\CertLog" | Measure-Object -Property Length -Sum

# 检查磁盘空间
Get-PSDrive C | Select-Object Used, Free

# 检查待处理请求数
certutil -view -restrict "Request.StatusCode=1" -out "RequestID" | findstr /i "Row count" 

3.5 日常巡检 Checklist

每日巡检

  • [ ] 检查 CertSvc 服务运行状态
  • [ ] 检查证书颁发是否有异常(大量失败请求)
  • [ ] 检查系统事件日志中是否有 CA 相关错误
  • [ ] 检查磁盘空间使用率
  • [ ] 检查 NTP 时间同步状态

每周巡检

  • [ ] 检查待处理的证书请求队列
  • [ ] 检查 CRL 发布是否正常,下次发布时间
  • [ ] 检查近一周的证书颁发统计
  • [ ] 检查 CA 数据库大小增长情况
  • [ ] 检查 IIS/AIA 分发点是否正常访问

每月巡检

  • [ ] 检查 CA 根证书和从属 CA 证书的有效期
  • [ ] 检查证书模板是否有需要更新
  • [ ] 审核已颁发的证书,清理过期证书
  • [ ] 检查吊销证书列表是否有异常
  • [ ] 执行完整的 CA 备份
  • [ ] 检查 CA 安全配置(权限、密钥保护)

4. 常见故障处理

4.1 故障列表

故障 1:证书申请失败("拒绝请求"或"策略不允许")

  • 现象:用户或计算机在申请证书时被拒绝,返回"策略不允许"或"拒绝请求"
  • 原因分析

    • 申请者没有证书模板的读取/申请权限
    • 证书模板配置的安全权限不足
    • 申请的证书模板被停用或已过期
    • 证书模板版本不匹配
    • 企业 CA 中模板发布状态不正确
  • 解决步骤

    1. 确认申请者 AD 账户所在 OU,检查证书模板权限:

      • 打开 certtmpl.msc → 右键证书模板 → 属性 → 安全
      • 确认申请者或所属组具有读取申请权限
    2. 确认证书模板已发布:

      • CA 管理控制台(certsrv.msc)→ 证书模板 → 确认模板在列表中
    3. 确认模板版本正确:

      # 检查证书模板版本
      certutil -CATemplates | findstr /i "<模板名称>"
    4. 检查 CA 配置中的模板兼容性:

      certutil -GetReg ca\CSP\*\*
    5. 检查事件查看器中的具体错误原因:

      Get-WinEvent -LogName "Microsoft-Windows-CertificateServices-Deployment/Operational" | Where-Object { $_.LevelDisplayName -eq "Error" } | Format-Table TimeCreated, Message -Wrap

故障 2:证书信任问题(客户端不信任颁发的证书)

  • 现象:使用 CA 颁发的证书时,浏览器/应用提示"证书不受信任"
  • 原因分析

    • 根 CA 证书未安装到客户端的受信任根证书颁发机构
    • 从属 CA 证书链不完整
    • AIA(颁发机构信息访问)配置错误
    • 证书吊销列表(CRL)无法下载
  • 解决步骤

    1. 检查根 CA 证书是否已部署到所有客户端:

      # 在客户端检查受信任根证书
      certlm.msc → 受信任的根证书颁发机构 → 证书
    2. 通过组策略推送根 CA 证书:

      • 组策略管理 → 计算机配置 → Windows 设置 → 安全设置 → 公钥策略 → 受信任的根证书颁发机构
    3. 检查 AIA 配置:

      # 检查 CA 的 AIA 配置
      certutil -GetReg ca\CACertPublicationURLs
      # 确保包含 HTTP 和 LDAP 路径
    4. 检查 CDP 配置:

      certutil -GetReg ca\CACRLPublicationURLs
      # 确认 CRL 可以通过 HTTP 访问
    5. 手动测试 CRL 访问:

      # 在浏览器中测试 CRL URL 是否可以访问
      # 例如:http://ca-server.domain.com/CertEnroll/<CA名称>.crl

故障 3:CRL 发布失败或 CRL 过期

  • 现象:客户端报错"吊销信息不可用",或 CRL 文件显示已过期
  • 原因分析

    • CRL 发布周期过长
    • IIS 目录权限不足
    • CA 数据库损坏
    • 磁盘空间不足
    • 网络问题导致无法发布到共享目录
  • 解决步骤

    1. 检查 CRL 状态:

      certutil -crl
      # 确认 Next CRL Publish 时间
    2. 手动发布 CRL:

      # 强制发布 CRL(增量)
      certutil -CRL
      
      # 强制发布完整 CRL(全量发布)
      certutil -crl + | certutil -CRL
    3. 检查 CRL 发布目录权限:

      • IIS 虚拟目录(默认:%SystemRoot%\System32\CertSrv\CertEnroll)
      • 确认 Everyone/Users 有读取权限
    4. 检查磁盘空间:

      Get-PSDrive C | Select-Object Used, Free
    5. 检查事件日志中的 CRL 发布错误
    6. 调整 CRL 发布周期(建议增量 CRL 每 1 天,完整 CRL 每 7 天):

      certutil -setreg ca\CRLPeriod "1"          # 完整 CRL 周期(天)
      certutil -setreg ca\CRLDeltaPeriod "1"     # 增量 CRL 周期(小时)
      certutil -setreg ca\CRLOverlapPeriod "12"  # 重叠周期(小时)
      net stop certsvc && net start certsvc

故障 4:CA 数据库损坏

  • 现象:证书颁发失败,certutil 命令报数据库错误,事件日志显示 Jet 数据库错误
  • 原因分析

    • 非正常关机导致数据库文件损坏
    • 磁盘故障
    • 数据库文件空间不足
    • 数据库版本不兼容
  • 解决步骤

    1. 停止 CA 服务:

      net stop certsvc
    2. 使用 esentutl 修复数据库:

      # 备份当前数据库
      copy "C:\Windows\System32\CertLog\*.edb" "C:\CertLog_Backup\"
      
      # 运行数据库修复
      esentutl /p "C:\Windows\System32\CertLog\CA.edb"
    3. 修复完成后修复数据库状态:

      esentutl /d "C:\Windows\System32\CertLog\CA.edb"
    4. 启动 CA 服务:

      net start certsvc
    5. 验证修复结果:

      certutil -view
    6. 如果修复失败,从备份中恢复 CA 数据库

故障 5:CA 密钥或证书即将过期

  • 现象:CA 根证书或从属 CA 证书将在 30-180 天内过期
  • 原因分析

    • CA 证书有效期有限(通常根 CA 10-20 年,从属 CA 5-10 年)
    • 没有及时续订
  • 解决步骤

从属 CA 证书续订

# 方法一:使用现有密钥对续订
certutil -renew

# 方法二:使用新密钥对续订
certutil -renew -keys

# 重新发布 CRL 和 CA 证书
certutil -crl

根 CA 证书续订(根 CA 需离线操作):

  1. 启动根 CA 服务器
  2. 打开 CA 管理控制台,右键 CA → 所有任务 → 续订 CA 证书
  3. 选择"生成新密钥对"或"使用现有密钥对"
  4. 将新根证书分发到所有客户端
  5. 重新签发从属 CA 证书

故障 6:证书吊销操作失败

  • 现象:吊销证书时提示"访问被拒绝"或吊销后证书仍被信任
  • 原因分析

    • 吊销权限不足
    • CRL 未及时发布或客户端缓存过期
    • 证书已被吊销或已过期
  • 解决步骤

    1. 检查吊销权限:

      # 确认有吊销权限的用户
      certutil -CAInfo | findstr /i "Manager"
    2. 吊销证书:

      # 按序列号吊销
      certutil -revoke <序列号> <吊销原因代码>
      # 吊销原因代码:0=未指定, 1=密钥泄露, 3=CA泄露, 4=终止运营, 5=证书替换
    3. 发布更新后的 CRL:

      certutil -CRL
    4. 在客户端验证吊销状态:

      certutil -urlcache * delete
      certutil -f -verifystore My
    5. 验证 CRL 中是否包含被吊销的证书

4.2 应急处理流程

CA 服务故障应急流程

CA 服务不可用 / 证书颁发中断
        |
   ┌────┴────┐
   │ 检查服务  │ net start certsvc → 启动 CA 服务
   └────┬────┘
        ↓
   ┌─────────┐
   │ 检查事件  │ 查看事件日志确定故障原因
   │ 日志     │
   └────┬────┘
        ↓
   ┌─────────┐
   │ 数据库   │ 如为数据库问题 → esentutl 修复
   │ 修复     │ 或从备份恢复
   └────┬────┘
        ↓
   ┌─────────┐
   │ 临时方案  │ 如无法立即恢复 → 启用备用 CA
   │         │ 或延长现有证书有效期
   └────┬────┘
        ↓
   ┌─────────┐
   │ 通知     │ 通知 IT 团队证书服务状态
   │         │ 更新运维事件记录
   └─────────┘

5. 备份与恢复

5.1 需要备份的数据

备份项说明备份频率建议
CA 数据库所有的证书颁发记录、吊销信息每日
CA 私钥CA 签名密钥(最敏感的数据)安装时备份 + 每次续订后
CA 证书CA 公钥证书每日(可重新签发)
配置文件CA 策略、模板配置每周
证书模板自定义证书模板每次修改后
根 CA 数据根 CA 的私钥和证书安装时备份(离线存储)

5.2 备份策略建议

使用 CA 内置备份工具(推荐):

# 使用 certutil 备份 CA(包含私钥、数据库和配置)
certutil -backup "D:\CABackup\Daily" --password <备份密码> --incremental

# 全量备份(首次或每周)
certutil -backup "D:\CABackup\Weekly" --password <备份密码>

# 备份 CA 私钥(导出为 PFX 文件)
certutil -exportPFX -p <密码> <CA名称> "D:\CABackup\CAKey.pfx"

使用 Windows Server Backup

# 安装 Windows Server Backup 功能
Install-WindowsFeature -Name Windows-Server-Backup

# 创建系统状态备份(包含 CA 数据)
wbadmin start systemstatebackup -backuptarget:D: -quiet

根 CA 备份(离线保存)

# 根 CA 离线备份步骤:
# 1. 启动根 CA 服务器
# 2. 执行完整备份
certutil -backup "E:\RootCABackup" --password <复杂密码>
# 3. 将备份文件复制到加密的 USB 存储介质
# 4. 将 USB 存储存放在保险柜中

备份保留策略

  • 每日备份保留 7 天
  • 每周备份保留 4 周
  • 每月备份保留 12 个月
  • 根 CA 备份永久保留(至少保留两个版本)

5.3 恢复步骤

从备份恢复 CA

# 1. 停止 CA 服务
net stop certsvc

# 2. 删除当前 CA 数据库(如有)
del "C:\Windows\System32\CertLog\*.*" /q

# 3. 恢复 CA 数据
certutil -restore "D:\CABackup\Daily" --password <备份密码>

# 4. 启动 CA 服务
net start certsvc

# 5. 验证恢复
certutil -view
certutil -CAInfo

从备份恢复 CA 私钥

# 1. 恢复 CA 私钥
certutil -importPFX "D:\CABackup\CAKey.pfx" -p <密码>

# 2. 验证私钥
certutil -key

# 3. 重启 CA 服务
net stop certsvc && net start certsvc

6. 安全配置

6.1 账户权限管理

CA 管理角色

角色/权限说明建议授予对象
CA 管理员(Full Control)CA 配置、续订、吊销所有权限安全管理员(1-2人)
证书管理员(Issue and Manage)审核和签发证书、吊销证书CA 操作员(2-3人)
审查员(Auditor)只读查看证书和日志审计人员
申请者提交证书申请域用户(通过模板权限控制)

权限配置

# 查看当前 CA 安全权限
certutil -GetReg ca\Security

# 常用安全组建议
# - CA_Admin:CA 管理员组
# - CA_Operators:证书审核操作员组
# - Cert_Requestors:证书申请者(通过 AD 组控制)

安全管理建议

  • CA 管理员账户使用独立的管理账户(不与日常工作混用)
  • 启用 AD 特权访问工作站(PAW)管理 CA
  • 根 CA 使用离线存储,仅必要时连接网络
  • 密钥使用 HSM 硬件保护(高安全环境)

6.2 防火墙规则

端口协议用途来源限制
443TCPCRL 发布点 (HTTPS)所有客户端
80TCPCRL 发布点 (HTTP)所有客户端
135TCPRPC(CA 管理)管理网段
445TCPSMB(文件共享发布点)管理网段
5722TCPRPC(CA 远程管理)管理网段

6.3 安全加固建议

  1. 密钥保护

    • 根 CA 密钥离线存储,放在保险柜中
    • 从属 CA 密钥使用 HSM 或软件加密保护
    • CA 私钥密码复杂度 20 位以上

      # 启用强密钥保护
      certutil -setreg ca\CSP\KeyLength 4096
      certutil -setreg ca\CSP\HashAlgorithm SHA256
  2. CA 配置安全

    • 禁用 CA Web 注册(非必要不启用)
    • 限制证书模板的申请权限(最小权限原则)
    • 配置证书有效期策略(服务器证书 1-2 年,用户证书 1 年)

      # 修改默认证书有效期
      certutil -setreg ca\ValidityPeriod "2"
      certutil -setreg ca\ValidityPeriodUnits "Years"
  3. CRL 安全

    • CRL 签名使用 SHA256 以上算法
    • CRL 有效期不宜过长(建议完整 CRL 7 天,增量 CRL 1 天)
    • CDP 和 AIA 地址使用 HTTPS(如果可能)
  4. 审计与监控

    • 启用 CA 审计(成功和失败操作)
    • 配置 CA 事件日志转发到 SIEM
    • 监控证书异常申请行为(批量申请、异常时间申请)
  5. 证书生命周期管理

    • 建立证书到期预警机制(提前 90/60/30 天告警)
    • 定期审查已颁发证书的用途和有效性
    • 及时吊销泄露/不再使用的证书

7. 参考资料

相关联系人

角色姓名联系电话邮箱
CA 管理员______
安全管理员______
AD 管理员______
微软技术支持400-820-3800
值班工程师______