处理HTTPS证书、RSA密钥、SM2证书或第三方接口时,经常会遇到.pem、.key、.crt和.cer文件,以及PRIVATE KEY、RSA PRIVATE KEY、PUBLIC KEY和CERTIFICATE等标记。 这些名称并不处于同一个层次。PEM和DER描述数据如何保存;PKCS#1、PKCS#8和SubjectPublicKeyInfo描述密钥内部结构;X.509描述证书如何保存主体、公钥、签发者、有效期和签名等信息。 只看文件扩展名经常会判断错误。更可靠的方式是先检查PEM头部,再解析内部ASN.1结构和算法标识。

01

先理解PEM和DER的区别

DER是一种二进制编码形式,适合程序、密码设备和协议直接处理。PEM则是在DER数据外层增加BEGIN和END边界,并把中间的二进制内容转换成Base64文本。 因此,PEM并不是一种独立的证书算法,也不会自动加密其中的数据。把DER转换为PEM通常只是改变表示形式,不会改变内部的RSA、SM2、公钥、私钥或证书内容。 PEM适合复制、粘贴和通过文本系统传递;DER体积更加紧凑,但无法直接作为普通文本阅读。

-----BEGIN 类型名称-----
Base64编码的DER数据
-----END 类型名称-----
02

CERTIFICATE表示X.509证书

BEGIN CERTIFICATE通常表示一个X.509证书。证书中包含主体、签发者、序列号、有效期、公钥、用途扩展和签名算法等信息,但不包含对应的私钥。 同样以CERTIFICATE开头的文件,内部可能保存RSA公钥、SM2公钥或其他算法的公钥。要确认算法,需要解析证书中的SubjectPublicKeyInfo和签名算法字段。 证书本身通常可以公开分发。服务器配置HTTPS时会同时使用证书和私钥,但不能因此认为证书文件中包含私钥。

-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
03

PUBLIC KEY表示通用公钥结构

BEGIN PUBLIC KEY通常表示SubjectPublicKeyInfo结构。它不仅保存公钥数据,还包含说明该公钥属于什么算法的AlgorithmIdentifier。 因此,同样的PUBLIC KEY头部可以承载RSA、SM2以及其他公钥算法。不能仅根据头部判断真实算法,需要继续解析内部OID和参数。 部分文档会将这种结构简称为PKIX公钥格式,但更准确的名称是SubjectPublicKeyInfo。它也是X.509证书内部保存主体公钥时使用的基本结构。

-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----
04

RSA PRIVATE KEY通常表示PKCS#1私钥

BEGIN RSA PRIVATE KEY通常表示RSA专用的PKCS#1私钥结构。它包含RSA模数、公开指数、私有指数、素数因子以及用于CRT加速计算的参数。 这种格式只能表示RSA私钥,不能直接保存SM2或其他算法的私钥。部分旧版OpenSSL配置和传统程序经常使用这种格式。 如果目标程序只接受RSA PRIVATE KEY,而现有文件是PRIVATE KEY,通常意味着需要在PKCS#8和PKCS#1之间转换,而不是简单修改第一行和最后一行。

-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----
05

PRIVATE KEY通常表示PKCS#8私钥

BEGIN PRIVATE KEY通常表示未加密的PKCS#8私钥容器。PKCS#8是算法无关的结构,会同时保存算法标识和对应的私钥数据,因此既可以承载RSA私钥,也可以承载SM2等其他算法的私钥。 这也是为什么两个完全不同算法的私钥,都可能以BEGIN PRIVATE KEY开头。要确认算法,必须解析容器内部的AlgorithmIdentifier。 如果头部是BEGIN ENCRYPTED PRIVATE KEY,则通常表示经过口令保护的PKCS#8私钥。未加密的PRIVATE KEY文件一旦泄露,任何获得文件的人都可能使用对应的私钥能力。

-----BEGIN PRIVATE KEY-----
未加密的PKCS#8私钥
-----END PRIVATE KEY-----

-----BEGIN ENCRYPTED PRIVATE KEY-----
经过加密保护的PKCS#8私钥
-----END ENCRYPTED PRIVATE KEY-----
06

根据头部和解析结果判断文件类型

遇到未知PEM文件时,先检查BEGIN标记,判断它大致属于证书、公钥还是私钥。然后使用解析工具读取算法、密钥位数、证书主体、签发者和有效期。 文件扩展名只能作为参考。.pem可能包含证书、公钥、私钥或证书链;.key可能是PKCS#1或PKCS#8;.crt和.cer也可能分别使用PEM或DER编码。 解析生产证书时可以使用本地PEM证书解析工具,但不要把生产私钥粘贴到任何在线服务。ParseNest的RSA和SM2工具只适合生成、解析测试材料。

CERTIFICATE           → X.509证书
PUBLIC KEY            → SubjectPublicKeyInfo公钥
RSA PRIVATE KEY       → RSA PKCS#1私钥
PRIVATE KEY           → 未加密PKCS#8私钥
ENCRYPTED PRIVATE KEY → 加密PKCS#8私钥
要点总结
  • PEM是Base64文本封装,DER是二进制编码,两者不是加密算法。
  • BEGIN CERTIFICATE表示X.509证书,证书中不包含私钥。
  • BEGIN PUBLIC KEY通常表示SubjectPublicKeyInfo公钥结构。
  • BEGIN RSA PRIVATE KEY通常表示RSA专用的PKCS#1私钥。
  • BEGIN PRIVATE KEY通常表示算法无关的PKCS#8私钥。
  • PKCS#8可以承载RSA、SM2和其他算法的私钥。
  • 不能只根据.pem、.key、.crt或.cer扩展名判断文件内容。
  • 不要通过修改BEGIN和END文字来转换密钥格式。
  • 生产私钥不应提交到在线解析服务。