1.证书标准
X.509:这是一种证书标准,主要定义了证书中应该包含哪些内容。其详情可以参考RFC5280,SSL使用的就是这种证书标准。
2.公钥加密标准(PKCS)
PKCS(The Public-Key Cryptography Standards))是由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准,其中包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议。
3.编码格式
同样的X.509证书,可能有不同的编码格式,目前有以下两种编码格式:
- PEM(Privacy Enhanced Mail):打开看文本格式,以“-----BEGIN…”开头,“-----END…”结尾,内容是BASE64编码。查看PEM格式证书的信息:openssl x509 -in certificate.pem -text -noout。Apache和*NIX服务器偏向于使用这种编码格式。
- DER(Distinguished Encoding Rules):打开看是二进制格式,不可读。查看DER格式证书的信息:openssl x509 -in certificate.der -inform der -text -noout。Java和Windows服务器偏向于使用这种编码格式。
4.相关的文件扩展名
- crt:certificate的缩写,存放的是证书。常见于*NIX系统,大多数是PEM编码,也可能是DER编码。
- cer:certificate的缩写,存放的是证书。常见于Windows系统,大多数是DER编码,也可能是PEM编码。
- key:通常用来存放一个公钥或者私钥。编码可能是PEM,也可能是DER。查看KEY的办法:openssl rsa -in mykey.key -text -noout(签名算法不是rsa时需要修改rsa为对应的算法)。如果是DER格式的话,同理应该这样了:openssl rsa -in mykey.key -text -noout -inform der。
- csr:Certificate Signing Request,即证书签名请求。这个并不是证书,而是向权威证书颁发机构获得签名证书的申请。查看的办法:openssl req -noout -text -in my.csr (如果是DER格式的话照旧加上-inform der,这里不写了)。
- pk8:使用PKCS#8标准,存放用户的私钥。
- pfx/p12:使用PKCS#12标准,存放用户的私钥和证书。
- jks:Java Key Store,是Java提供的密钥库。jks里有KeyEntry和CertEntry,而且可以具有多个Entry。KeyEntry包含私钥和证书。CertEntry只包含证书。在库里的每个Entry都是靠别名来识别的。可以使用keytool来操作jks。
- bks:是Bouncy Castle提供的密钥库。Android客户端只支持BKS类型的密钥库。
- bks和jks的区别:JKS和JCEKS是Java密钥库(KeyStore)的两种比较常见类型,JKS的Provider是SUN,在每个版本的JDK中都有。BKS来自BouncyCastleProvider,它使用的是TripleDES来保护密钥库中的Key,它能够防止证书库被不小心修改(Keystore的keyentry改掉1个bit都会产生错误),BKS能够跟JKS互操作。
5.证书编码的转换
- PEM转DER:
openssl x509 -in cert.crt -outform der -out cert.der
- DER转PEM:
openssl x509 -in cert.crt -inform der -outform pem -out cert.pem
(提示:转换KEY文件也类似,只不过把x509换成rsa或者其他对应的算法)
6.简单总结
好了,证书的概念我们也理清了,接下来可以上代码了吧?呃,请再等一等。因为在代码的实现过程中我们需要数据证书管理工具来生成一大堆相关的文件,如果对这些工具没有一定的了解可能会出现一脸懵逼的情况,所以接下来我们先对数据证书的管理工具做下介绍:SSL从理论到实践(四)——Keytool
参考
1.SSL协议详解
2.让SSL/TLS协议流行起来:深度解读SSL/TLS实现
3.使用wireshark观察SSL/TLS握手过程–双向认证/单向认证
4.Android 6.0 SSL通信
5.SSL/TLS的原理以及互联网究竟是如何工作的(1-5)
6.JDK 中的证书生成和管理工具 keytool
7.那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)