服务器开发程序员必须搞清HTTPS通讯之证书( 四 )


2. BERBasic Encoding Rules(BER)是DER的一个子集 。
3. CERCER是另一种编码标准 , 用来编码ASN.1结构
4. PEMDER是个二进制文件 , 为了方便传输 , 可以将DER转换为PEM(Privacy enhanced Electronic mail)格式 。PEM是Base64编码方式 , 以:-----BEGIN CERTIFICATE----- 开头 , -----END CERTIFICATE----- 结尾 。
5. 编码转换PEM转为DER
openssl x509 -in cert.pem -out cert.der -outform DERDER转为PEM
openssl x509 -incert.der -inform DER -out cert.pem -outform PEM16. 其它的证书格式7.6.1 PKCS#12(后缀.pkcs12 .pfx .p12)非对称加密的一种格式 , 微软推出 。PKCS#12把证书和密钥对打包成一个文件 , 还可以再对文件进行加密保护 。通过OpenSSL pkcs12子命令将密钥对(privkey.pem)、服务器实体证书(cert.pem)、中间证书(chain.pem)转换成一个文件:
openssl pkcs12 -export -out cert.pfx-inkey privkey.pem -in cert.pem -certfile chain.pem生成 cert.pfx时会提示进行口令保护 。可以再使用命令从pfx中再导出密钥对和证书:
# 导出密钥对openssl pkcs12 -in cert.pfx -nodes -nocerts -out new_privkey.pem# 导出服务器实体证书openssl pkcs12 -in cert.pfx -nodes -clcerts -out new_cert.pem# 导出中间证书openssl pkcs12 -in cert.pfx -nodes -cacerts -out new_chain.pem7.6.2 PKCS#7主要用来进行数字签名和数据加密 , 文件后缀一般是.p7b或.p7c , 使用OpenSSL crl2pkcs7进行操作 。
# 生成 cert.p7bopenssl crl2pkcs7 -nocrl -certfile cert.pem -certfile chain.pem -out cert.p7b# 导出完整证书链文件 , 服务器实体证书在文件顶部 , 中间证书在文件底部openssl pkcs7 -print_certs -in cert.p7b -out fullchain.cer7.6.3 BKSBouncyCastleProvider , 它使用的也是TripleDES来保护密钥库中的Key , 它能够防止证书库被不小心修改(Keystore的keyentry改掉1个bit都会产生错误) , BKS能够跟JKS互操作 。由于Android/ target=_blank class=infotextkey>安卓无法直接支持jks的证书库 , 在安卓下一般需要使用BKS类型证书 。
7. CSR管理7.7.1 查看CSR前面使用OpenSSL命令生成了CSR文件  ,  下面使用命令查看CSR文件内容:
openssl req -in mykey_csr.pem -noout -text

服务器开发程序员必须搞清HTTPS通讯之证书

文章插图
 
其中:
  • Subject Public Key Info : 生成的公钥 , 包含了e和n等RSA信息
  • Signature Algorithm 表示签名算法和签名值 。
7.7.2 校验CSR签名openssl req -in myreq.pem -noout -verify -key mykey_csr.pem八、导入根证书更新根证书库 , 一般原因:
  • 有新成立了一个CA机构 , 要导入到根证书库中
  • 自签名了一个证书 , 要导入根证书库
  • 系统根证书库太旧
    Linux下 命令行update-ca-certificates可以用来同步证书 。
    windows下可以双击.cer文件弹出安装证书界面 。
本文没有使用keytool工具 , 后面会使用keytool工具进行测试 。本文学习资源来源:《深入浅出HTTPS从原理到实战》 电子工业出版社 虞卫东著 。感谢原作者 。

【服务器开发程序员必须搞清HTTPS通讯之证书】


推荐阅读