使用Java实现CA(不考虑证书链)
一. 准备
1. JDK 1.6
2. 安装 BouncyCaslte 包,把jar放入ext文件夹,并在 java.security 加入 BouncyCaslte 包的 Provider
3. 概念通俗解释
Key:密钥、公钥、私钥都称为key,key有大小,比如1024bit、256bit等。
安全对象:目前有key pair--即公私钥对;key--包括密钥和单独的公钥、私钥;证书(CRT)--包括X.509 v1、X.509 v2(用于CRL,即证书撤销列表)、X.509 v3。
加密:包括对称加密和非对称加密(公私钥加密)。
对称加密:RC4、Blowfish、DES、3DES等等,一般使用key来做密钥,常用一个密码字符串来生成key,可以理解为key的代表。
非对称加密:RSA、DSA等等,也称为公私钥对加密,用公钥加密的只能用私钥解密,用私钥加密的只能用公钥解密。
消息摘要:作用是验证内容的正确性,比如MD5、SHA1、SHA256等,是对任何输入的数据都生成一定位数的值(128bit、256bit等等),是不可逆运算,并且保证1.只要输入有差异,得到的值就不同;2.输入一致就得到相同的值。
签名和验证:对内容做消息摘要后用私钥加密后的数据即签名,验证签名就是解密后得到消息摘要然后和内容计算出的消息摘要比对,符合就说明内容完整且来源明确。
公私钥对:非对称加密的公私钥对。
数字证书--解释1:公钥+信息(表明此公钥是谁的信息,有固定格式,可以扩展),然后用CA的私钥对它做签名。有些信息只有 X.509 V3版本才能填写,因为有相对V1新增的扩展域。
数字证书--解释2:是将用户(或其他实体)身份与公钥绑定的信息载体。一个合法的数字证书不仅要符合 X509 格式规范,还必须有 CA 的签名。用户不仅有自己的数字证书,还必须有对应的私钥。X509v3 数字证书主要包含的内容有:证书版本、证书序列号、签名算法、颁发者信息、有效时间、持有者信息、公钥信息、颁发者 ID、持有者 ID 和扩展项。
CA证书:用自己的私钥签名自己的公钥+自己的身份信息,生成自签名的CA证书
CA私钥:和CA证书里的公钥匹配的私钥
二. 编码
1. 编码的目的:为了把结构复杂的安全对象(如公钥、私钥、证书等)变成字节流以便存储和传递。
2. 编码和文件格式
DER
辨别编码规则(DER),可包含所有私钥、公钥和证书。它是大多数浏览器的缺省格式,并按 ASN.1 DER 格式存储,是无报头的,可以存为二进制或Base64编码。PEM 是用文本报头包围的 DER。
PEM
Openssl使用 PEM(Privacy Enhanced Mail)格式来存放各种信息,它是openssl 默认采用的信息存放方式。Openssl 中的 PEM 文件一般包含如下信息:
1. 内容类型:表明本文件存放的是什么信息内容,它的形式为“——BEGIN XXXX——”,与结尾的“——END XXXX——”对应。
2. 头信息:表明数据是如何被处理后存放,openssl 中用的最多的是加密信息,比如加密算法以及初始化向量 iv。
3. 信息体:为 BASE64 编码的数据。可以包括所有私钥(RSA 和 DSA)、公钥(RSA 和 DSA)、证书请求和 (x509) 证书。它存储用 Base64 编码的 DER 格式数据,用 ASCII 报头包围,因此适合系统之间的文本模式传输。
PFX 或 P12
公钥加密标准 #12 (PKCS#12) 可包含所有私钥、公钥和证书。其以二进制格式存储,也称为 PFX 文件,通常以p12为扩展名,Windows下可以直接运行导入到IE浏览器,一般用来导入私钥。
CER
一般指使用DER格式的证书。不过现在以cer为扩展名的文件都是PEM格式的证书文件,并且Windows下能直接导入。
KEY
一般指PEM格式的私钥文件。
JKS
Java使用的安全对象保存格式,一般称呼为密钥库,和p12一样,都能包含所有私钥、公钥和证书,只是格式不同。不过p12整个密钥库和私钥用相同密码进行保护,而JKS可以用不同密码,一般建议相同,这样和p12互相转换就比较方便了。JKS、DER、p12和PEM都是密钥库,各有特色,一般交换时都用p12和pem。
3. Windows下常用格式
Windows的IE的证书导出向导有常用的支持格式,可以导出二进制DER格式或Base64编码的证书;PEM格式的证书就是有报头的Base64编码的DER证书,一般使用cer扩展名;有私钥一般用p12。
三. 各步骤描述
1. 生成CA步骤
1) 生成一个公私钥对
2) 用私钥对身份信息和公钥签名,即生成 CA证书,同时私钥就是 CA私钥了
2. 签发证书步骤1
1) 生成一个公私钥对
2) 用CA的私钥对身份信息和公钥签名,即生成了此CA签发的证书了
3. 签发证书步骤2
1) 生成一个公私钥对
2) 用私钥对身份信息和公钥签名后生成证书请求文件(CSR),一般使用 PKCS#10 格式保存CSR
3) 提取CSR里的公钥和信息,用CA的私钥签名,即生成了此CA签发的证书了