用户处理国密(SM2)证书时,必须使用支持国密算法的专用工具,如 `gmssl` 或特定版本的 `openssl`(如1.1.1k及以上)。标准的 `openssl` 工具链无法识别国密 SM2 私钥结构。
一、准备工作:检查并安装工具
执行转换前,请确认你使用的是支持国密的工具版本。
bash
# 检查 gmssl 是否已安装
gmssl version
# 检查 openssl 版本,1.1.1k 或更高版本才可能支持国密
openssl version
如果未安装,可以从 `gmssl.org` 下载源码或通过包管理器安装。
二、证书格式速览
格式 文件后缀 编码 典型用途
PEM `.pem`, `.crt`, `.cer` Base64文本 Linux/Nginx/Apache等,最常见、可读性强
DER `.der`, `.cer` 二进制 部分Java应用或设备
PFX / PKCS#12 `.pfx`, `.p12` 二进制 | Windows/IIS平台,可同时包含证书、私钥和证书链
三、核心转换命令
以下是三种核心格式的互相转换命令。所有命令均基于 `gmssl` 编写,若你使用的 `openssl` 支持国密,也可直接套用。
1. PEM ↔ DER 互转
PEM 转 DER:
bash
gmssl x509 -in cert.pem -outform der -out cert.der
DER 转 PEM**:
bash
gmssl x509 -in cert.der -inform der -out cert.pem
2. PEM ↔ PFX 互转**
PEM格式的证书和私钥通常是分开的两个文件,需要“打包”成一个PFX文件。反之,从PFX文件可以“解包”出PEM格式的证书和私钥。
PEM (证书+私钥) → PFX (打包)
bash
gmssl pkcs12 -export -out certificate.pfx -inkey private.key -in certificate.crt -certfile ca_bundle.crt
命令执行时会提示设置**导出密码**,这是保护PFX文件的关键。
参数说明:
`-inkey private.key`:私钥文件。
`-in certificate.crt`:站点证书文件。
`-certfile ca_bundle.crt`:中间证书链文件(可选)。
PFX → PEM (解包)
```bash
# 提取私钥
gmssl pkcs12 -in certificate.pfx -nocerts -out private_key.pem -nodes
# 提取证书(不含私钥)
gmssl pkcs12 -in certificate.pfx -nokeys -out certificate.pem -nodes
```
命令执行时会要求输入导入密码,即打包PFX时设置的密码。`-nodes`参数表示不加密输出的PEM私钥。
3. DER ↔ PFX 转换
由于DER和PFX不直接转换,需要PEM作为“中转站”:
DER → PFX:`DER → PEM → PFX`
bash
gmssl x509 -in cert.der -inform der -out cert.pem
gmssl pkcs12 -export -out certificate.pfx -inkey private.key -in cert.pem
PFX → DER:`PFX → PEM → DER`
bash
gmssl pkcs12 -in certificate.pfx -nokeys -out cert.pem -nodes
gmssl x509 -in cert.pem -outform der -out cert.der
四、实战补充:从国密双证书生成PFX
国密体系常采用签名证书和加密SSL证书的双证书模式。若要将这两个证书及其对应的私钥打包成一个PFX文件,可以使用以下命令。这里假设所有证书和私钥均为PEM格式。
bash
# 将国密签名证书、加密证书及对应的两个私钥打包进同一个PFX
gmssl pkcs12 -export -out gm_dual.pfx -inkey sign.key -in sign.crt -certfile enc.crt -inkey enc.key -name "SM2 Dual Certificates"
注意:`-inkey`参数只能出现一次,这里用`-certfile`引入了加密证书,再将加密私钥`enc.key`作为补充信息传递。具体语法可能因gmssl版本有差异,建议查阅官方文档确认。
注意事项
安全第一:转换过程中私钥会以明文形式在磁盘上短暂停留。建议仅在安全的离线环境中操作,转换完成后立即清理临时文件。导出未加密的私钥存在安全风险,仅限于离线调试环境使用。
保留完整证书链:确保转换后的证书文件(尤其是PFX文件)包含了完整的证书链(即站点证书+中间证书+根证书)。遗漏中间证书可能导致在某些客户端上验证失败。
在线转换工具:如果对命令行不熟悉,可以选择使用可信的在线转换工具,但务必通过HTTPS加密连接上传文件,以防私钥泄露。例如SSLeye提供了在线国密SM2证书格式转换服务。
如果需要了解其他特定场景的转换命令,可以告诉我。