原创 转载请注明地址
今天由于在项目过程中遇到了一个https认证失败的问题(其实是由于我的部署配置不对导致的。。),于是翻看了一下《HTTP图解》一书的七八两章,虽然问题是由于失误产生的,但是学习的内容还是值得一记的。也算是没有白费这些看书的时间,下面的内容都是自己看书后的理解,如有不对之处,欢迎各路大神批评指正!鞠躬!
HTTPS
由上图可以看到,使用http协议在安全性上存在着巨大的不足。 为了加强HTTP协议的安全性,通过与SSL(Secure Socket Layer,安全套接层)或TLS(Transport Layer Security,安全层传输协议)组合使用,加密HTTP的通信内容。由此就产生了HTTPS的概念,即与SSL或TLS组合使用的HTTP协议。
SSL不仅提供了加密处理,还能提供一种名为证书的手段,用于验证方身份。证书由第三方机构颁发,以证明客户端或服务端是真实存在的,防止恶意对象对服务器或客户端进行伪装造成安全问题,同时也能确定报文的完整性(即发出的报文与接收到的报文内容一致)。
综上所述HTTP+加密+认证+完整性保护=HTTPS。也可以说,HTTPS是披着SSL外壳的HTTP。
HTTPS加密
SSL采用公开密钥加密的处理方式对通信内容进行加密
- 共享密钥加密 :加密和解密使用同一个密钥,也被称为对称密钥加密,使用此方式加密是必须将密钥一同发送给对方,其问题在于确保密钥传输的安全性难以保证。
- 公开密钥加密:使用两把密钥加密,一把私钥,一把公钥。顾名思义,公钥则相当于共享密钥加密方式中的密钥,传输的信息都由公钥进行加密处理(单向函数加密);而私钥只能由公钥的发布方一人持有,否则此加密方式将失去意义,私钥用于对加密信息进行解密。此方式私钥无需进行传输,故无需担心私钥被盗。
ps:公开密钥加密方式性能比共享密钥差。
HTTPS加密方式
HTTPS使用的加密方式为上述两种方式的混合方式:交换密钥环节使用公开密钥加密方式保证密钥的安全性,之后建立通信交换报文阶段使用共享密钥方式提高性能。
证明公开密钥正确性的证书
在公开密钥加密方式中,如何确定公钥是否被恶意攻击者替换十分重要。为解决这个问题,可以使用第三方权威数字证书验证机构和其相关机关颁发的数字证书。
数字证书认证机构业务流程:
1、服务器向认证机构提出公开密钥申请;
2、认证机构判明申请者的身份后对公钥签名;
3、将公钥与签名绑定在一起放入公钥证书中;
4、将证书发送给客户端,用作公开密钥加密方式通信。客户端验证证书真实有效性:
通过认证机构的公钥,客户端可以对服务器公钥证书上的数字签名进行验证,若通过验证,客户端可以确定:
1、认证服务器公钥的机构是真实有效的;
2、服务器公钥是可信任的。
ps:大多数浏览器开发商发布版本时,会事先在内部植入常用认证机关的公开密钥。通过上述步骤后客户端与服务器就能使用服务器公钥进行加密传输了。
可以确认客户端的客户端证书
客户端获取的用于验证客户端真实存在的证书,其使用方式和服务器证书相同。
自签名证书
使用OpenSSL这套开源程序,每个人都可以构建一套自己的认证机构,即自认证机构,使服务器可以自己给自己颁发证书,但该证书在互联网中没有作用,故被戏称为自签名证书。浏览器访问持有自签名证书的服务器时,会显示“无法确认连接安全性”或“该网站的安全证书存在问题”等警告消息。自签名证书无法消除伪装的可能性。
HTTPS安全通信机制
由上述内容总结一下HTTPS的安全通信
- 服务器和客户端协商决定加密组件;
- 服务器将公钥证书发送给客户端;
- 客户端验证证书后取出公钥,生成pre-master secret用于后续共享密钥加密方式通信;
- 客户端将pre-master secret用服务器公钥加密后发送给服务器;
- 服务器用私钥解密获取pre-master secret