国际:美国的verisign公司,加拿大的ENTRUST公司
国内:在金融CA方面,根证书由中国人民银行管理,非金融CA方面,由中国电信负责
虽然证书编码格式有2种,但是扩展名有很多:
扩展名说明.der用于DER编码的证书.pem它是基于X.509标准生成的,它是以"-----BEGINCERTIFICATE-----"和"-----ENDCERTIFICATE-----"开头和结尾且用Base64编码的证书.crt这种扩展名的证书可以是DER编码也可以是PEM编码,在Unix系统中常见。.cer微软系统常见,在微软系统中可以将.crt转换为.cer。同样可以是DER编码也可以是PEM编码。.key用于存储公钥和私钥,同样可以使用DER或者PEM编码。.csr这个不是证书文件,而是证书签名请求文件,向CA申请获得签名证书时需要提供的申请文件。[注]
CSR(CertificateSignRequest)、公钥、密钥和证书归属为一类。CSR用来获取证书,包含申请人的公钥、邮件等证明身份的信息。证书颁发机构(可以是自己)收到CSR后签发证书,生成的证书中包含公钥、有效期、持有人等信息。私钥可单独生成,也可在生成CSR的同时生成。整个过程中,私钥应当都要被妥善保管,不能泄露。
keystore、PEM、cer/crt、key等文件存储格式可归为一类。JavaKeyStore(文件后缀.keystore或.jks)是Java常用的存储密钥和证书的文件格式,需要设置文件密码、别名和别名密码,安卓打包和部署Tomcat时会用到;PEM(PrivacyEnhancedMail)以文本形式存放私钥和证书(链);cer/crt和key分别用来存放证书和密钥;另外一种常见的格式是pfx和p12,同jks格式,这类文件一般是二进制,访问需要密码。
PKI(Publickeyinfrastructure)体系构建在公钥加密基础之上,主要解决证书的颁发和管理问题。证书管理中应用广泛的两个标准是X509和PKCS。遵循X509标准的证书文件结尾多为PEM、der、crt等;遵循PKCS标准的证书常用后缀名是pfx、p12等。
本次对接晕乎的第二个地方是一处地方读取密钥需要密码,另一处直接读取。根据存储格式可知原因:访问遵循PKCS#12标准的pfx文件需要密码,遵循X509规范的PEM文件则可直接查看内容。
[注]
SSL/TLS提供的服务主要有:
1、身份认证,确保消息发送双方身份的真实性。
2、加密传输,消息以密文传递,防止中途被窃取。
3、数据校验,确保消息在传输途中不会被篡改。
#先生成csr和私钥
#注意使用-nodes选项,否则私钥会有密码,用在nginx启动时需要手动输入
opensslreq-new-outtlanyan.csr-newkeyrsa:2048-nodes-keyouttlanyan.priv.key
#接下来的交互里填入一些基本信息,完毕后会生成tlanyan.csr和tlanyan.priv.key两个文件
#csr的格式如下:
#-----BEGINCERTIFICATEREQUEST-----
#xxxx
#-----ENDCERTIFICATEREQUEST-----
#密钥文件的格式类似
#有了csr,接下来为自己签发证书
opensslreq-x509-sha256-nodes-days365-intlanyan.csr-keytlanyan.priv.key-outtlanyan.crt
#命令结束后,目录中出现tlanyan.crt的证书文件
#校验密钥
opensslrsa-intlanyan.priv.key--check
#校验csr
opensslreq-intlanyan.csr-verify
#校验证书
opensslx509-intlany.**crt-text-n**ooutPEM
转换各种不同格式的证书:
#将pem格式转换成pfx/p12格式
opensslpkcs12-export-outtlanyan.pfx-inkeytlanyan.priv.key-intlaPEMn.crt
#将pfx格式转换成pem格式
opensslpkcs12-intlanyan.pfx-outtlanyan.cer-nodes
#生成的tlanyan.cer文件包含了证书和公钥,对应导入前的tlanyan.crt和tnPEM.priv.key两个文件
pem和jks的格式转换太过复杂,具体请看Oracle的文档。
F2)自签名证书如何添加和安装.
自签名证书的如何生成、安装?有时候,我们在内部系统传输数据需要使用SSL协议,对数据加密,但是我们又不想花钱去申请CA,这个时候可以使用自签名CA,实现数据加密传输的功能。首先要明确一点就是自签名证书是不安全的,存在安全漏洞,具体看下面的博文介绍:
自签名证书使用jdk中的keytool生成即可,看似神秘,但实际上比较简单,见下博文:
自签名证书的安装也很简单,见下博文:
在java编程中,使用socket网络编程,实现SSL协议,对服务器的证书需要导入到客户端的秘钥库中,这样才能完成自动认证,具体实现见下博文: