openssl生成各类格式的秘钥及java程序的读取

前言

工作中,因为会对接不同地方的接口,经常遇到不同保存形式的 公私钥证书。初次遇见,存在很多专有名词,如:(jks,pcks#8, CBC, X509, CER, PEM)。分辨和理解起来难免有些复杂。所以出此文档,一方面更快地理清各种名词的含义,一方面,从java代码的角度,快速对这些公私钥进行读取解析。

名词分类

一、存储格式维度

  1. JKS (Java KeyStore)
    • Java专属的密钥库格式,用于存储私钥、证书链和受信任证书。
    • 文件扩展名:.jks
    • 关联标准:Java安全体系。
  2. PKCS#12 / PFX
    • 跨平台的密钥库格式,支持存储私钥、证书链和证书。
    • 文件扩展名:.p12.pfx
    • 关联标准:PKCS#12(公钥密码学标准)。
  3. Keystore(泛称)
    • 广义的密钥库容器,可以是JKS、PKCS#12、BKS(Android专用)等具体实现。

二、证书格式维度

证书(如 .crt)本质上是公钥 + 签名信息

  1. X.509
    • 国际标准的证书格式,定义公钥证书的结构(如版本、序列号、签名算法等)。
    • 常见扩展名:.cer, .crt, .der, .pem
  2. CER
    • 通常指X.509证书文件,编码格式可能是DER(二进制)或PEM(Base64文本)。
  3. PEM (Privacy Enhanced Mail)
    • 基于文本的证书/密钥编码格式,用-----BEGIN CERTIFICATE-----包裹Base64内容。
    • 常见扩展名:.pem, .crt, .key
  4. DER (Distinguished Encoding Rules)
    • 二进制格式的X.509证书或密钥,适用于机器处理。
    • 常见扩展名:.der, .cer

三、加密标准维度(PKCS系列)

  1. PKCS#1
    • 定义RSA公钥/私钥的语法和加密机制(如RSAES-OAEP)。
    • 常见于.key文件或PEM格式。
  2. PKCS#7
    • 定义加密消息语法(如数字签名、证书链的封装),常用于.p7b证书链文件。
  3. PKCS#8
    • 定义私钥的通用存储格式,支持不同算法(如RSA、ECDSA)。
    • 编码格式为PEM或DER。

四、加密算法与模式维度

  1. 对称加密模式
    • CBC (Cipher Block Chaining)
      块加密模式,需初始化向量(IV)。
    • GCM (Galois/Counter Mode)
      支持认证加密(AEAD)的模式,常用于TLS 1.2+。
    • ECB (Electronic Codebook)
      基础块加密模式,安全性较低。
  2. 非对称加密算法
    • RSA
      基于大数分解的公钥算法,用于加密和签名。
    • ECC (Elliptic Curve Cryptography)
      基于椭圆曲线的公钥算法(如ECDSA、EdDSA)。

五、密钥类型维度

  1. 对称密钥 (Symmetric Key)
    • 如AES密钥(128/256位),用于加密数据。
  2. 非对称密钥对 (Asymmetric Key Pair)
    • 公钥 (Public Key)
      公开分发,用于加密或验证签名。
    • 私钥 (Private Key)
      严格保密,用于解密或生成签名。

六、协议与场景维度

  1. TLS/SSL
    • 使用X.509证书和密钥(如RSA/ECC)建立安全通信。
  2. 数字签名
    • 使用私钥签名(如SHA256withRSA),公钥验证。
  3. 证书颁发机构 (CA)
    • 签发X.509证书的权威实体,依赖PKI体系。

加密模式

快速的 openssl 生成命令

  1. openssl 生成pkcs1格式的私钥,密钥长度1024位, (PKCS1)
    1
    openssl genrsa -out private.pem 1024
  2. PKCS1私钥转换为PKCS8.
    1
    openssl pkcs8 -topk8 -inform PEM -in private.pem -outform pem -nocrypt -out pkcs8.pem
  3. PKCS8格式私钥再转换为PKCS1格式
    1
    openssl rsa -in pkcs8.pem -out pkcs1.pem
  4. 从pkcs1私钥中生成pkcs1公钥
    1
    openssl rsa -in private.pem -RSAPublicKey_out -out public.pem
  5. 从pkcs1私钥中生成pkcs8公钥
    1
    openssl rsa -in private.pem -pubout -out public.pem
  6. 从pkcs8私钥中生成pkcs8公钥
    1
    openssl rsa -in pkcs8.pem -pubout -out public_pkcs8.pem
  7. pkcs8公钥转pkcs1公钥
    1
    openssl rsa -pubin -in public.pem -RSAPublicKey_out -out public_pkcs1.pem
  8. pkcs1公钥转换为pkcs8公钥
    1
    openssl rsa -RSAPublicKey_in -in pub_pkcs1.pem -pubout

参考资料:

  1. openssl 生成RSA秘钥 以及 秘钥格式的相互转换 https://blog.csdn.net/hellokandy/article/details/121162324
  2. RSA密钥文件格式 https://blog.csdn.net/ChenTest100/article/details/138243776
  3. 使用openssl生成Java可以读取的密钥和自签名证书 https://blog.alvinkwok.cn/post/7