openssl生成各类格式的秘钥及java程序的读取
前言
工作中,因为会对接不同地方的接口,经常遇到不同保存形式的 公私钥证书。初次遇见,存在很多专有名词,如:(jks,pcks#8, CBC, X509, CER, PEM)。分辨和理解起来难免有些复杂。所以出此文档,一方面更快地理清各种名词的含义,一方面,从java代码的角度,快速对这些公私钥进行读取解析。
名词分类
一、存储格式维度
- JKS (Java KeyStore)
- Java专属的密钥库格式,用于存储私钥、证书链和受信任证书。
- 文件扩展名:
.jks
- 关联标准:Java安全体系。
- PKCS#12 / PFX
- 跨平台的密钥库格式,支持存储私钥、证书链和证书。
- 文件扩展名:
.p12
或.pfx
- 关联标准:PKCS#12(公钥密码学标准)。
- Keystore(泛称)
- 广义的密钥库容器,可以是JKS、PKCS#12、BKS(Android专用)等具体实现。
二、证书格式维度
证书(如
.crt
)本质上是公钥 + 签名信息
- X.509
- 国际标准的证书格式,定义公钥证书的结构(如版本、序列号、签名算法等)。
- 常见扩展名:
.cer
,.crt
,.der
,.pem
。
- CER
- 通常指X.509证书文件,编码格式可能是DER(二进制)或PEM(Base64文本)。
- PEM (Privacy Enhanced Mail)
- 基于文本的证书/密钥编码格式,用
-----BEGIN CERTIFICATE-----
包裹Base64内容。 - 常见扩展名:
.pem
,.crt
,.key
。
- 基于文本的证书/密钥编码格式,用
- DER (Distinguished Encoding Rules)
- 二进制格式的X.509证书或密钥,适用于机器处理。
- 常见扩展名:
.der
,.cer
。
三、加密标准维度(PKCS系列)
- PKCS#1
- 定义RSA公钥/私钥的语法和加密机制(如RSAES-OAEP)。
- 常见于
.key
文件或PEM格式。
- PKCS#7
- 定义加密消息语法(如数字签名、证书链的封装),常用于
.p7b
证书链文件。
- 定义加密消息语法(如数字签名、证书链的封装),常用于
- PKCS#8
- 定义私钥的通用存储格式,支持不同算法(如RSA、ECDSA)。
- 编码格式为PEM或DER。
四、加密算法与模式维度
- 对称加密模式
- CBC (Cipher Block Chaining)
块加密模式,需初始化向量(IV)。 - GCM (Galois/Counter Mode)
支持认证加密(AEAD)的模式,常用于TLS 1.2+。 - ECB (Electronic Codebook)
基础块加密模式,安全性较低。
- CBC (Cipher Block Chaining)
- 非对称加密算法
- RSA
基于大数分解的公钥算法,用于加密和签名。 - ECC (Elliptic Curve Cryptography)
基于椭圆曲线的公钥算法(如ECDSA、EdDSA)。
- RSA
五、密钥类型维度
- 对称密钥 (Symmetric Key)
- 如AES密钥(128/256位),用于加密数据。
- 非对称密钥对 (Asymmetric Key Pair)
- 公钥 (Public Key)
公开分发,用于加密或验证签名。 - 私钥 (Private Key)
严格保密,用于解密或生成签名。
- 公钥 (Public Key)
六、协议与场景维度
- TLS/SSL
- 使用X.509证书和密钥(如RSA/ECC)建立安全通信。
- 数字签名
- 使用私钥签名(如SHA256withRSA),公钥验证。
- 证书颁发机构 (CA)
- 签发X.509证书的权威实体,依赖PKI体系。
加密模式
快速的 openssl 生成命令
- openssl 生成pkcs1格式的私钥,密钥长度1024位, (PKCS1)
1
openssl genrsa -out private.pem 1024
- PKCS1私钥转换为PKCS8.
1
openssl pkcs8 -topk8 -inform PEM -in private.pem -outform pem -nocrypt -out pkcs8.pem
- PKCS8格式私钥再转换为PKCS1格式
1
openssl rsa -in pkcs8.pem -out pkcs1.pem
- 从pkcs1私钥中生成pkcs1公钥
1
openssl rsa -in private.pem -RSAPublicKey_out -out public.pem
- 从pkcs1私钥中生成pkcs8公钥
1
openssl rsa -in private.pem -pubout -out public.pem
- 从pkcs8私钥中生成pkcs8公钥
1
openssl rsa -in pkcs8.pem -pubout -out public_pkcs8.pem
- pkcs8公钥转pkcs1公钥
1
openssl rsa -pubin -in public.pem -RSAPublicKey_out -out public_pkcs1.pem
- pkcs1公钥转换为pkcs8公钥
1
openssl rsa -RSAPublicKey_in -in pub_pkcs1.pem -pubout
参考资料:
- openssl 生成RSA秘钥 以及 秘钥格式的相互转换 https://blog.csdn.net/hellokandy/article/details/121162324
- RSA密钥文件格式 https://blog.csdn.net/ChenTest100/article/details/138243776
- 使用openssl生成Java可以读取的密钥和自签名证书 https://blog.alvinkwok.cn/post/7