Java实现7种常见密码算法( 五 )


Report ::= SEQUENCE {author OCTET STRING,title OCTET STRING,body OCTET STRING,}这个语法描述了一个结构体 , 它包含3个属性author、title、body , 且都是字符串类型 。
DER与PEMDER是ASN.1的一种序列化编码方案 , 也就是说ASN.1用来描述对象结构 , 而DER用于将此对象结构编码为可存储的字节数组 。
PEM(Privacy Enhanced Mail)是一种将二进制数据 , 以文本形式进行存储或传输的方案 , 早期主要用于邮件中交换证书 , 它的文本内容常以-----BEGIN XXX-----开头 , 并以-----END XXX-----结尾 , 而中间 Body 部分则为 Base64 编码后的数据 , 如下是一个证书的PEM样例 。

Java实现7种常见密码算法

文章插图
以上面证书为例 , PEM与DER的关系大概如下:
PEM = "-----BEGIN CERTIFICATE-----" + base64(DER) +"-----END CERTIFICATE-----"X.509、PKCS8、PKCS12等X.509、PKCS8、PKCS12等都是公钥密码学标准(PKCS)组织制定的各种密码学规范 , 该组织使用ASN.1语法为密钥、证书、密钥库等定义了标准的对象结构 , 常见的如下:
  • X.509规范:用于描述证书与公钥的标准格式 。
  • PKCS7规范:可描述的对象很多 , 不过一般也是用于描述证书的 。
  • PKCS8规范:用于描述私钥的标准格式 。
  • PKCS12规范:用于描述密钥库的标准格式 。
  • PKCS1规范:用于描述RSA算法及其公私钥的标准格式 。
这些规范都有相应的RFC文档 , 感兴趣的可以前往查看:
PEM:https://www.rfc-editor.org/rfc/rfc7468X.509:https://datatracker.ietf.org/doc/html/rfc5280PKCS7:https://datatracker.ietf.org/doc/html/rfc2315PKCS8:https://datatracker.ietf.org/doc/html/rfc8351PKCS12:https://datatracker.ietf.org/doc/html/rfc7292PKCS1:https://datatracker.ietf.org/doc/html/rfc8017#appendix-A类比一下 , 如果把ASN.1比作Java , 那X.509就是使用Java定义的一个名叫X509的类 , 这个类里面包含身份信息、公钥信息等相关字段 , 而DER就是一种Java对象序列化方案 , 用于将X509这个类的对象序列化为字节数组 , 字节数组保存为文件后 , 这个文件就是我们常说的证书或密钥文件 。
常见证书文件由于PKCS组织并未给证书文件定下标准的文件名后缀 , 所以证书文件有非常多的后缀名 , 如下:
  • .der: DER编码的证书 , 一般是X.509规范的 , 无法用文本编辑器直接打开
  • .pem: PEM编码的证书 , 一般是X.509规范的
  • .crt: 常见于unix类系统 , 一般是X.509规范的 , 可能是DER编码或PEM编码
  • .cer: 常见于windows系统 , 一般是X.509规范的 , 可能是DER编码或PEM编码
  • .p7b: 常见于windows系统 , PKCS7规范证书 , 可能是DER编码或PEM编码
  • .pfx:PKCS12规范的密钥库文件 , 也有取名为.p12的
  • .jks:java专用的密钥库文件格式 , 在java技术栈内使用较多 , 非java一般使用.pfx
证书概念小结
Java实现7种常见密码算法

文章插图
生成证书与密钥库openssl命令提供了大量的工具 , 用以生成密钥、证书与密钥库文件 , 如下 , 是一个典型的生成密钥与证书的过程:
# 生成pkcs1 rsa私钥openssl genrsa -out rsa_private_key_pkcs1.key 2048# 生成pkcs1 rsa公钥openssl rsa -in rsa_private_key_pkcs1.key -RSAPublicKey_out -out rsa_public_key_pkcs1.key# 生成证书申请文件cert.csropenssl req -new -key rsa_private_key_pkcs1.key -out cert.csr# 自签名(演示时使用 , 生产环境一般不用自签证书)openssl x509 -req -days 365 -in cert.csr -signkey rsa_private_key_pkcs1.key -out cert.crt# ca签名(将证书申请文件提交给ca机构签名)openssl x509 -req -days 365 -in cert.csr -CA ca_cert.crt -CAkey ca_private_key.pem -CAcreateserial -out cert.crt# 生成p12密钥库文件openssl pkcs12 -export -in cert.crt -inkey rsa_private_key_pkcs1.key -name demo -out keystore.p12

经验总结扩展阅读