2022-03-18
说明
本博客每周五更新一次。 https是在原有http基础上增加ssl实现通信加密和用户身份认证,http协议数据明文传送,可以被网络工具拦截直接阅读,https是以密文形式传递,没有证书和算法,无法解密数据内容。 由于https通信过程中需要加密和解密,其效率低于http协议。
分享
详情
https加密文件
- https认证文件主要包括三部分:公钥、私钥、证书(加密相关知识此处不做说明),一般称为CA证书,该证书可向机构申请或自己创建,自己创建的缺少公共认证,会有安全提醒,不影响使用,申请的短时间有免费注册平台如阿里云、腾讯云,长时间需要收费。
主流证书
一般主流的Web服务软件,通常都基于OpenSSL和Java两种基础密码库。
- Tomcat、Weblogic、JBoss等Web服务软件,一般使用Java提供的密码库。通过Keytool工具,生成Java Keystore(JKS、keystore)格式的证书文件。
- Apache、Nginx等Web服务软件,一般使用OpenSSL工具提供的密码库,生成PEM、KEY、CRT等格式的证书文件。
- IBM的Web服务产品,如Websphere、IBM Http Server(IHS)等,一般使用IBM产品自带的iKeyman工具,生成KDB格式的证书文件。
- 微软Windows Server中的Internet Information Services(IIS)服务,使用Windows自带的证书库生成PFX格式的证书文件。
编程语言需要的证书格式并不一致,Java采用jks或keystore,.Net采用pfx和cer,Php则采用pem和cer。 Java 证书工具为keytool,.Net 管理工具makecert
密钥库文件
所有的公钥和私钥同证书都会被存储在密钥库中,因为证书需要被签名, 签名必须使用非对称加密算法+HASH算法 所以一般是MD5和RSA 或者 SHA1和RSA
格式 | 扩展名 | 描述 | 特点 |
---|
JKS | .jks/.ks | Java Keystore密钥库的Java实现版本,provider为SUN | 密钥库和私钥用不同的密码进行保护 | JCEKS | .jce | JCE Keystore密钥库的JCE实现版本,provider为SUN JCE | 相对于JKS安全级别更高,保护Keystore私钥时采用TripleDES | PKCS12 | .p12/.pfx | PKCS #12个人信息交换语法标准 | 1、包含私钥、公钥及其证书2、密钥库和私钥用相同密码进行保护 | BKS | .bks | Bouncycastle Keystore密钥库的BC实现版本,provider为BC | 基于JCE实现 | UBER | .ubr | Bouncycastle UBER Keystore密钥库的BC更安全实现版本,provider为BC | |
证书文件
格式 | 扩展名 | 描述 | 特点 |
---|
DER | .cer/.crt/.rsa | ASN .1 DER用于存放证书 | 不包含私钥,二进制格式 | PKCS7 | .p7b/.p7r | PKCS #7加密信息语法标准 | 1、p7b以树状展示证书链,不含私钥 | 2、p7r为CA对证书请求签名的回复,只能用于导入 | | | | CMS | .p7c/.p7m/.p7s | Cryptographic Message Syntax | 1、p7c只保存证书 2、p7m:signature with enveloped data 3、p7s:时间戳签名文件 | PEM | .pem | Printable Encoded Message | 1、该编码格式在RFC1421中定义,其实PEM是【Privacy-Enhanced Mail】的简写,但他也同样广泛运用于密钥管理 2、ASCII文件 3、一般基于base 64编码 | PKCS10 | .p10/.csr | PKCS #10 公钥加密标准 | 1、证书签名请求文件 2、ASCII文件 3、CA签名后以p7r文件回复 | SPC | .pvk/.spc | Software Publishing Certificate | 微软公司特有的双证书文件格式,经常用于代码签名,其中 1、pvk用于保存私钥 2、spc用于保存公钥 |
证书转换
https认证方式
- https认证方式有两种,单向认证和双向认证,认证过程使用安全的非对称加密,完成认证使用对称加密。
单向认证
- 认证流程如下图,仅对服务端认证,一般web服务使用该认证方式。
B_公钥和B_私钥存储在服务端,一次完整请求流程如下:
- 客户端发起HTTPS请求,将SSL协议版本的信息发送给服务端。
- 服务端将包含公钥和签名的CA证书发送给客户端
- 客户端读取CA证书的明文信息,采用相同hash散列函数计算得到信息摘要(hash目的:验证防止内容被修改),用操作系统带的CA的公钥去解密签名(因为签名是用CA的私钥加密的),对比证书中的信息摘要。如果一致,则证明证书是可信的,从CA证书提取B_公钥
- 客户端生成一个随机数(密钥F),用B_公钥去加密这个随机数形成密文,发送给服务端。
- 服务端接收信息,用自己的B_私钥解密密文,得到了密钥F
- 后续服务端和客户端使用密钥F(对称加密)进行通信。
双向认证
- 双向认证和单向认证原理类似,单向认证客户端需要认证服务端,双向认证增加服务端认证客户端。
B_公钥和B_私钥存储在服务端,C_公钥和C_私钥存储在服务端,一次完整请求流程如下:
- 客户端发起HTTPS请求,将SSL协议版本的信息发送给服务端。
- 服务端将自身CA证书发送给客户端
- 客户端读取CA证书明文信息,采用相同hash散列函数计算得到信息摘要(hash目的:验证防止内容被修改),用操作系统带的CA的公钥去解密签名(因为签名是用CA的私钥加密的),对比证书中的信息摘要。如果一致,则证明证书是可信的,从CA证书提取B_公钥
- 客户端发送客户端证书给服务端,证书里面有客户端的公钥:C_公钥
- 客户端发送支持的对称加密方案给服务端,供其选择
- 服务端选择完加密方案后,用得到的C_公钥进行加密,并发送给客户端
- 客户端用C_私钥解密选好的加密方案,并生成一个随机数(密钥F),用服务端B_公钥加密密钥F,并将结果发送给服务端。
- 服务端和客户端使用密钥F完成后续通讯过程。
参考资料
- https://www.cnblogs.com/yaphetsfang/articles/12858356.html
- https://www.cnblogs.com/benwu/articles/4891758.html
总结
- https是一种通过公钥、私钥、证书使用非对称加密完成认证,对称加密完成数据传输的通信协议,单向认证有中间人攻击可能,双认证相对安全,但需要客户端有自己的证书和是公钥、私钥,相对服务,所以web服务使用单向加密。
- 网络通信协议是网络基础,身为程序员必学必会。加油。
|