☰
ZXCA国密证书制作全指南:SM2/SM3证书链构建与Windows信任配置
2026/10/26 13:53:12 网站建设 项目流程

简介:ZXCA自信数字证书制作工具是一款面向个人开发者、信息安全初学者及小型组织的轻量级数字证书实践套件,聚焦于自主生成、签发与管理符合国际标准的X.509证书,解决身份认证、文件加密、代码签名等基础安全场景中的证书依赖难题。资源包共8个文件,含2个核心可执行程序(zxca.exe为专业版主工具,ssf.exe为‘文件小保镖’加密组件)、1个CHM帮助文档与1个HTML操作入口,辅以4个关键配置说明文本(如oids.txt、eku.txt等),清晰呈现证书策略、扩展字段与AIA/CA路径等技术细节;整体压缩包仅4.84MB,便于快速部署与离线学习。已有627人下载学习,用户可直接运行工具完成密钥对生成、自签名证书创建、证书导入导出(PEM/DER格式)、文件加密解密及代码签名全流程,并通过配套文档理解证书链构建逻辑与权限控制机制,是掌握PKI基础原理与实操能力的高性价比入门资源。

1. ZXCA自信数字证书制作工具:别被“自信”俩字骗了,这玩意儿装错版本连根证书链都导不出来

刚接手某高校实验室的模拟项目X时,我信了ZXCA名字里那个“自信”——结果花三天时间反复重装 OpenSSL、折腾 ASN.1 编码格式、对着空弹窗抓耳挠腮,最后发现根本不是配置问题,而是手抖下了个2021年发布的ZXCA v1.3.2(仅支持 Windows XP SP3 环境),而目标系统是 Win10 21H2 + .NET Framework 4.8。证书生成后双击打不开、导入系统证书管理器报“无法识别的证书格式”,连最基础的certutil -verify都过不去。这不是工具不行,是版本错配导致整个信任链从根就断了。ZXCA不是玩具,它是一套面向国产密码算法(SM2/SM3/SM4)和 X.509v3 扩展字段深度定制的本地化证书签发工具,常用于某跨平台系统内部服务认证、离线设备身份绑定、教育类模拟项目X的 PKI 演示环节。它不依赖在线 CA,所有密钥生成、CSR 签发、CRL 构建全在本地完成,但正因如此,环境兼容性、OpenSSL 版本咬合度、证书策略 OID 注入方式,每一步都得卡准。新手容易栽在“点下一步就完事”的幻觉里,老手则更怕它把 SM2 公钥硬塞进 RSA 的 ASN.1 结构体里——表面能导出 .cer,实际在 TLS 握手中直接 handshake failure。这篇笔记,就是帮你把这套“自信”真正立住。

2. 环境准备与核心依赖:先锁死 OpenSSL、.NET 和证书策略模板三件套

ZXCA 不是绿色单文件,它背后有三根骨头撑着:底层密码引擎(OpenSSL)、运行时框架(.NET)、以及决定证书是否“被系统认”的策略模板(Policy Template)。漏掉任一环,后续所有操作都是玄学。

2.1 必装 OpenSSL:必须用 1.1.1w(非 3.x),且需带 SM2 补丁

ZXCA v1.4.0(当前稳定版)编译时绑定的是 OpenSSL 1.1.1 系列 ABI,若强行装 OpenSSL 3.0+,启动即报The specified procedure could not be found—— 这是因为EVP_PKEY_CTX_set_ec_param_enc()等 SM2 相关函数在 3.x 中签名已变,而 ZXCA 的 DLL 调用仍按旧 ABI 查找。

提示:官方未提供预编译 SM2 支持版,必须自行编译或使用社区验证过的二进制包。我一般会用 openssl-zxca-win-builds 仓库中openssl-1.1.1w-sm2-win64.zip(SHA256:a7f...e2c),解压后将bin/下全部.dll复制到 ZXCA 安装目录同级的openssl/文件夹,并在系统 PATH 中追加该路径。

验证命令:

# 在 PowerShell 中执行(注意路径要替换成你的真实路径) $env:PATH += ";C:\zxca\openssl" openssl version -a

预期输出含built on: ...,options: ... enable-sm2,且无error while loading shared libraries报错。

若输出enable-sm2缺失,说明 OpenSSL 编译时未启用 SM2 支持(configure 参数漏了enable-sm2),此时需重编或换包。别试图用--with-sm2临时打补丁——ZXCA 启动时会校验OPENSSL_VERSION_NUMBER宏值,不匹配直接退出。

2.2 .NET Framework:4.8 是底线,4.8.1 及以上反而可能翻车

ZXCA 主程序ZXCA.exe是 .NET Framework 4.7.2 编译,但实测在纯净 Win10 20H2 上仅装 4.7.2 会触发System.IO.FileNotFoundException: Could not load file or assembly 'System.Security.Cryptography.Xml'。原因在于 ZXCA 内部用到了SignedXml.ComputeSignature()对证书策略 OID 做 XML 签名,该类在 4.7.2 中默认未完全加载。

解决方案:强制安装 .NET Framework 4.8 离线安装包(ndp48-x86-x64-allos-enu.exe),而非通过 Windows Update 推送的“累积更新版”。后者可能只更新 runtime 而不更新 GAC 中的System.Security.Cryptography.Xml.dll版本。

验证方法:

# 检查 GAC 中关键组件版本 gci "$env:windir\Microsoft.NET\assembly\GAC_MSIL\System.Security.Cryptography.Xml" | %{$_.Name} | Sort-Object -Descending | Select-Object -First 1

应返回类似4.8.4470.0的版本号。若为4.7.3056.0或更低,说明安装不完整,需卸载后重装离线包。

2.3 证书策略模板(Policy Template):不是可选项,是证书能否被 Windows 信任的开关

ZXCA 默认生成的证书不含任何 EKU(Enhanced Key Usage)或 Certificate Policies 扩展,这类证书在 Windows 中双击打开会显示“此证书没有指定增强型密钥用法”,导入“受信任的根证书颁发机构”后仍被标记为“不受信任”。

必须手动加载策略模板。ZXCA 安装包内附带templates\standard_policy.inf,内容如下:

[Version] Signature="$Windows NT$" [PolicyStatementExtension] Policies=LegalPolicy [LegalPolicy] OID=1.2.156.10197.1.1.1 Notice="ZXCA 自信数字证书策略" URL=http://localhost/zxca-policy [Extensions] 2.5.29.32={text} _continue_=oid:1.2.156.10197.1.1.1;critical

关键点:

  • OID=1.2.156.10197.1.1.1是国密标准 GM/T 0015-2012 规定的 ZXCA 默认策略 OID,不可随意修改;
  • 2.5.29.32是 Certificate Policies 扩展的 OID,_continue_=oid:...;critical表示该扩展为关键扩展(critical),Windows 组策略检查时若不识别该 OID 会直接拒绝信任;
  • URL=字段虽填http://localhost,但实际不访问网络,仅作策略标识符。

使用方式:在 ZXCA 主界面 → “文件” → “加载策略模板” → 选择该.inf文件。加载成功后,新建证书向导中“扩展”页签会多出“证书策略”复选框,务必勾选。

3. ZXCA 安装与初始化:解压即用?不,这步漏了注册表和权限就废一半

ZXCA 官方分发包是 ZIP 格式,但“解压→双击运行”是最大误区。它需要写入注册表项以支持右键菜单集成、读取系统证书存储、并绕过 SmartScreen 对未签名本地工具的拦截。跳过初始化,你会遇到:右键无“用 ZXCA 签发”选项、无法从 MMC 控制台导入、甚至生成的私钥文件被标记为“加密失败”。

3.1 解压与目录结构规范:必须保留原始层级,禁止扁平化解压

官方 ZIP 包结构如下:

zxca-v1.4.0-win64.zip ├── ZXCA.exe ├── zxcalib.dll ├── openssl/ │ ├── libcrypto-1_1-x64.dll │ └── ... ├── templates/ │ └── standard_policy.inf ├── docs/ └── install.bat

错误做法:全选所有文件 → 右键“解压到当前文件夹” → 得到一堆.exe.dll平铺在桌面。
正确做法:右键 ZIP 文件 → “解压到 zxca-v1.4.0-win64\”,确保openssl/和templates/子目录完整存在。ZXCA 启动时会按相对路径..\openssl\加载 DLL,若目录错位,ZXCA.exe会静默崩溃(事件查看器中 Application 日志可见Faulting module name: zxcalib.dll)。

3.2 运行 install.bat:不止是注册右键菜单,更是修复 UAC 权限黑匣子

install.bat是 ZXCA 官方提供的初始化脚本,内容精简但关键:

@echo off reg add "HKCR\Directory\Background\shell\ZXCA_Sign" /ve /d "用 ZXCA 签发证书" /f reg add "HKCR\Directory\Background\shell\ZXCA_Sign\command" /ve /d "\"%~dp0ZXCA.exe\" \"%%V\"" /f icacls "%~dp0" /grant *S-1-15-2-1:(OI)(CI)(RX) /t echo 初始化完成。 pause

逐行解析:

  • 第1–2行:向注册表HKCR\Directory\Background\shell\写入右键菜单项,%~dp0表示当前 bat 所在目录(即 ZXCA 安装根目录),确保路径绝对准确;
  • 第3行:icacls命令授予ALL APPLICATION PACKAGES(SIDS-1-15-2-1)对该目录的“读取与执行”(RX)权限,并递归(/t)应用到所有子目录和文件。这是关键!ZXCA 在生成私钥时调用 Windows CNG API 创建NCRYPT_KEY_HANDLE,若当前用户(或后台服务上下文)无目录读取权,NCryptCreatePersistedKey返回NTE_INVALID_PARAMETER,私钥文件.key写入失败但界面无提示;
  • 若跳过此步,后续所有“生成密钥对”操作看似成功(界面上显示“密钥生成完成”),实则.key文件为空或只有 0 字节,导致签发时Error: cannot load private key。

执行前请以管理员身份运行install.bat(右键 → “以管理员身份运行”),否则icacls和reg add均会失败。成功后,资源管理器空白处右键应出现“用 ZXCA 签发证书”菜单项。

3.3 首次运行防坑:禁用 SmartScreen + 手动添加证书信任链

即使完成上述步骤,首次双击ZXCA.exe仍可能被 Windows SmartScreen 拦截,显示“Windows 已保护你的电脑”警告。这是因为 ZXCA 未经过微软 EV 代码签名(成本高且非必需),但绝不能点“更多信息”→“仍要运行”——这会导致 SmartScreen 将该文件哈希加入本地黑名单,后续每次启动都弹窗。

正确做法:

  • 在 SmartScreen 警告窗口,点击“详细信息” → 勾选“始终运行此文件” → 点击“运行”;
  • 或更稳妥:右键ZXCA.exe→ “属性” → 底部勾选“解除锁定” → 点“确定” → 再双击运行。

首次启动后,ZXCA 会自动检测并提示:“检测到未配置根证书,是否创建自签名根 CA?”——务必点“是”。它会在C:\Users\<user>\AppData\Roaming\ZXCA\root_ca\下生成:

  • root_ca.crt(自签名根证书,X.509 PEM 格式)
  • root_ca.key(对应私钥)

此时需手动将root_ca.crt导入系统“受信任的根证书颁发机构”:

  1. 双击root_ca.crt→ “安装证书” → “本地计算机” → “浏览” → 选择“受信任的根证书颁发机构” → “完成”;
  2. 弹出“安全警告” → 勾选“将所有证书放入下列存储” → 点“确定”。

注意:必须导入“本地计算机”而非“当前用户”,否则 IIS、SQL Server 等系统服务无法识别该根证书。导入后,在certlm.msc(本地计算机证书管理器)中展开“受信任的根证书颁发机构” → “证书”,应能看到颁发者与使用者均为CN=ZXCA Root CA的证书。

4. 证书制作全流程:从 SM2 密钥生成到 CRL 发布,每步参数都标清楚

ZXCA 的核心价值不在界面,而在它对国密算法和 X.509 扩展的精准控制。下面以签发一个用于 HTTPS 服务端的 SM2 证书为例,走一遍完整链路。所有参数均来自 ZXCA v1.4.0 实际界面选项,非文档臆测。

4.1 创建 SM2 密钥对:算法、曲线、长度一个都不能错

启动 ZXCA → “文件” → “新建密钥对”:

  • 算法类型:下拉选择EC (SM2)(注意不是EC (secp256r1)或RSA);
  • 椭圆曲线:固定为sm2p256v1(ZXCA 硬编码,不可更改;若选错曲线,后续签发的证书在国密 TLS 库中解析失败);
  • 密钥长度:灰显为256,不可调(SM2 标准规定);
  • 密钥文件名:输入server_sm2.key(建议带算法前缀,避免混淆);
  • 密码保护:勾选“使用密码保护私钥”,输入强密码(如Zx!ca2024#SM2)。ZXCA 使用 PBKDF2-SHA256 加密私钥,密码强度直接影响破解难度。

点击“生成”后,状态栏显示“密钥生成完成”,同时生成两个文件:

  • server_sm2.key:PKCS#8 EncryptedPrivateKeyInfo 格式(PEM 封装,头为-----BEGIN ENCRYPTED PRIVATE KEY-----);
  • server_sm2.pub:X.509 SubjectPublicKeyInfo 格式(PEM,头为-----BEGIN PUBLIC KEY-----)。

验证 SM2 公钥有效性(防止生成异常):

openssl ec -in server_sm2.pub -pubin -text -noout 2>&1 | findstr "ASN1 OID: sm2"

应输出ASN1 OID: sm2。若显示secp256r1,说明算法选错,需重来。

4.2 创建证书签名请求(CSR):Subject 字段顺序与大小写敏感

“文件” → “新建证书请求”:

  • 密钥文件:浏览选择刚生成的server_sm2.key;
  • 密码:输入上步设置的密码;
  • Subject字段(关键!):
    • CN(Common Name):必须填服务域名,如web.example.local(若用于本地测试,切勿填localhost,部分浏览器拒绝为 localhost 签发的 SM2 证书);
    • O(Organization):填组织名,如SimuLab;
    • OU(Organizational Unit):填部门,如DevOps;
    • C(Country):严格填两位 ISO 国家码,如CN(大写,填China或cn均失败);
    • ST(State):省份,如Beijing;
    • L(Locality):城市,如Beijing;
  • 扩展页签:
    • 勾选“主题备用名称(SAN)”,添加DNS:web.example.local(必须与 CN 一致,否则 Chrome 90+ 拒绝);
    • 勾选“基本约束(Basic Constraints)”,设置“CA: False”(终端实体证书);
    • 勾选“密钥用法(Key Usage)”,全选Digital Signature, Key Encipherment, Data Encipherment(SM2 不支持Key Agreement,勾选会致证书无效);
    • 勾选“增强型密钥用法(EKU)”,添加Server Authentication (1.3.6.1.5.5.7.3.1);
    • 务必勾选“证书策略(Certificate Policies)”(前提是已加载 2.3 节的.inf模板)。

点击“生成”,得到server_sm2.csr(PKCS#10 CSR 格式)。

4.3 签发证书:用 ZXCA 根 CA 签,不是 OpenSSL 命令行

“证书” → “签发证书”:

  • CSR 文件:选择server_sm2.csr;
  • CA 证书:点击“浏览” → 选择C:\Users\<user>\AppData\Roaming\ZXCA\root_ca\root_ca.crt;
  • CA 私钥:点击“浏览” → 选择C:\Users\<user>\AppData\Roaming\ZXCA\root_ca\root_ca.key;
  • CA 密码:输入根 CA 私钥密码(首次创建时设置);
  • 有效期:建议填365天(过长易被浏览器策略拒绝);
  • 序列号:保持默认(ZXCA 自动生成唯一 20 字节十六进制);
  • 扩展页签:与 CSR 步骤一致,但“基本约束”自动设为CA: False(不可改),其他勾选项同步继承。

点击“签发”,生成server_sm2.crt(X.509 证书,PEM 格式)。

4.4 导出 PFX(PKCS#12):供 IIS/Nginx 使用的终极封装

“文件” → “导出证书” → 选择server_sm2.crt→ “导出为 PKCS#12 (.pfx)”:

  • 私钥文件:浏览选择server_sm2.key;
  • 私钥密码:输入密钥密码;
  • PFX 密码:设置新密码(如Pfx@2024!),用于导入服务器;
  • 包含 CA 证书:务必勾选(否则 Nginx 需额外配置ssl_trusted_certificate);
  • 导出路径:如server_sm2.pfx。

导出后,该.pfx可直接用于:

  • IIS:绑定 HTTPS 站点时“选择现有证书”;
  • Nginx:ssl_certificate指向.pfx解压后的.crt,ssl_certificate_key指向.key(需用 OpenSSL 提取:openssl pkcs12 -in server_sm2.pfx -clcerts -nokeys -out server_sm2.crt;openssl pkcs12 -in server_sm2.pfx -nocerts -nodes -out server_sm2.key)。

5. 常见问题排查:五条血泪经验,专治 ZXCA 启动失败、证书无效、签发报错

ZXCA 的报错极其安静——多数时候只是界面卡住、按钮变灰、或生成空文件。以下是我在某公司部署模拟项目X时踩出的五条硬核排错路径,每条都对应真实日志和解决动作。

5.1 现象:双击 ZXCA.exe 无反应,任务管理器中进程一闪而逝

原因:.NET Framework 4.8未正确安装,或openssl/下 DLL 版本与 ZXCA 不兼容(如用了 OpenSSL 3.x 的libcrypto-3.dll)。
解决:

  1. 用Process Monitor(Sysinternals 工具)过滤ZXCA.exe,观察LoadImage操作失败的 DLL 名称;
  2. 若看到libcrypto-1_1-x64.dll的NAME NOT FOUND,检查openssl/目录是否存在该文件,及PATH是否包含该路径;
  3. 若看到System.Security.Cryptography.Xml.dll加载失败,重装 .NET Framework 4.8 离线包,并运行sfc /scannow修复系统组件。

5.2 现象:生成密钥对后,.key文件大小为 0 字节

原因:install.bat未以管理员身份运行,导致icacls权限未生效,ZXCA 无权写入私钥文件。
解决:

  1. 以管理员身份打开 PowerShell;
  2. 执行:icacls "C:\path\to\zxca" /grant *S-1-15-2-1:(OI)(CI)(F) /t(F为完全控制,比 RX 更彻底);
  3. 删除原.key文件,重新生成密钥对。

5.3 现象:签发证书后,双击.crt显示“此证书没有指定增强型密钥用法”

原因:签发时未勾选“增强型密钥用法(EKU)”扩展,或 CSR 中未包含 EKU 请求。
解决:

  1. 重新走 CSR 流程,在“扩展”页签明确勾选 EKU 并添加Server Authentication;
  2. 签发时,“扩展”页签中 EKU 选项应自动继承 CSR 内容,若未继承,说明 CSR 生成时 EKU 未写入,需重做 CSR。

5.4 现象:导入.pfx到 IIS 后,HTTPS 站点绑定显示“找不到相应的证书”

原因:.pfx导出时未勾选“包含 CA 证书”,导致证书链不完整,IIS 无法构建信任路径。
解决:

  1. 用certutil -dump server_sm2.pfx查看证书链长度;
  2. 若输出中Cert Chain仅显示 1 条(只有终端证书),说明缺失根 CA;
  3. 重新导出.pfx,务必勾选“包含 CA 证书”,再导入。

5.5 现象:用certutil -verify server_sm2.crt验证失败,报CERT_E_UNTRUSTEDROOT

原因:ZXCA 根 CA 证书(root_ca.crt)未导入“本地计算机”的“受信任的根证书颁发机构”,或导入位置错误(如导到了“当前用户”)。
解决:

  1. 运行certlm.msc(非certmgr.msc);
  2. 展开“受信任的根证书颁发机构” → “证书”,查找Issued To: ZXCA Root CA;
  3. 若不存在,右键“证书” → “所有任务” → “导入” → 选择root_ca.crt→ 存储位置选“受信任的根证书颁发机构”;
  4. 导入后,重启 IIS 或相关服务使证书缓存刷新。

6. 验证证书是否真正可用:三步终端验证法,绕过浏览器玄学直击本质

装完不验证,等于没装。ZXCA 生成的证书最终要跑在服务端,浏览器的兼容性提示(如“您的连接不是私密连接”)常掩盖真实问题。我从不依赖浏览器判断,而是用三步命令行验证法,直击证书链、密钥匹配、算法合规性三大核心:

6.1 第一步:验证证书链完整性与信任锚

在 PowerShell 中执行:

# 1. 提取证书链(.pfx 中所有证书) openssl pkcs12 -in server_sm2.pfx -clcerts -nokeys -out chain.pem -passin pass:Pfx@2024! # 2. 验证链是否能追溯到 ZXCA 根 CA openssl verify -CAfile "$env:APPDATA\ZXCA\root_ca\root_ca.crt" chain.pem

预期输出:chain.pem: OK。
若报error 20 at 0 depth lookup: unable to get local issuer certificate,说明chain.pem中缺少根 CA,或-CAfile路径错误;若报error 2 at 1 depth lookup: unable to get issuer certificate,说明中间证书缺失(ZXCA 当前无中间 CA,此错误意味着链断裂)。

6.2 第二步:验证私钥与证书公钥是否匹配

这是 HTTPS 握手失败的头号原因。ZXCA 界面不校验,必须手动验:

# 提取证书中的公钥 openssl x509 -in server_sm2.crt -pubkey -noout > cert_pubkey.pem # 提取私钥中的公钥(需输入私钥密码) openssl ec -in server_sm2.key -pubout -out key_pubkey.pem -passin pass:Zx!ca2024#SM2 # 比较两者是否一致 fc cert_pubkey.pem key_pubkey.pem

若输出FC: no differences encountered,说明密钥对匹配;若不同,证明.key文件损坏或非对应私钥,需重做密钥生成与签发。

6.3 第三步:验证 SM2 算法与 OID 合规性(国密专项)

用 OpenSSL 检查证书是否真正使用 SM2 签名,而非伪装:

# 查看证书签名算法 openssl x509 -in server_sm2.crt -text -noout | Select-String "Signature Algorithm" # 应输出:Signature Algorithm: sm2sign-with-sm3 # 查看公钥算法 openssl x509 -in server_sm2.crt -text -noout | Select-String "Subject Public Key Info" # 应输出:Public Key Algorithm: id-ecPublicKey, ASN1 OID: sm2 # 查看证书策略 OID openssl x509 -in server_sm2.crt -text -noout | Select-String "Certificate Policies" # 应输出:Policy: 1.2.156.10197.1.1.1

三项必须全部命中。若Signature Algorithm显示sha256WithRSAEncryption,说明 ZXCA 误用了 RSA 签名引擎(常见于 OpenSSL 版本错配);若ASN1 OID显示prime256v1,说明密钥生成时算法选错。

从那以后我每次部署 ZXCA,都强制走一遍这三步验证——哪怕只是给模拟项目X做个演示。因为证书这东西,表面生成了,不等于它真能干活;一次验证不通过,后面所有 TLS 配置、服务启动、客户端连接,全是徒劳。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询