引用: https://mp.weixin.qq.com/s/eSy0Xrm77jdspfOh_6gR0Q
本文分三块叙述:
1 CA相关知识
2HTTPS 通信过程
3如何搭建https服务
首先总体看下https 通信过程:
1.服务器向CA机构获取证书,当浏览器首次请求服务器的时候,服务器返回证书给浏览器。(证书包含:公钥+申请者与颁发者的相关信息+签名)
2.浏览器得到证书后,开始验证证书的相关信息,证书有效(没过期等)。
3.验证完证书后,如果证书有效,客户端是生成一个随机数,然后用证书中的公钥进行加密,加密后,发送给服务器,服务器用私钥进行解密,得到随机数。之后双方便开始用该随机数作为钥匙,对要传递的数据进行加密、解密
接下来进行一一解释
-------------------------CA相关-----------------------------
什么是CA
CA是Certificate Authority的缩写,也叫“证书授权中心”。
它是负责管理和签发证书的第三方机构,CA必须是所有行业和所有公众都信任的、认可的。因此它必须具有足够的权威性。
在我国,要成为CA必须获得国家工信部的批准。我国第一家获得CA资质的机构是山东省数字证书认证管理有限公司,获批于2005年8月19日。
目前,全球主流的CA机构有Symantec、GeoTrust、DigiCert、Thawte、GlobalSign、RapidSSL等。
不管对于企业还是个人用户而言,安装由权威CA机构颁发的SSL证书,访问HTTPS加密网站,才是网站的“正确打开方式”
什么是CA证书?
CA 证书,顾名思义,就是CA颁发的证书。
尽管CA证书如此强大,也不是所有需要数字证书的地方,都必须使用CA证书。假如业务需求的安全等级不高,使用自主研发的数字证书也可以,没有达到国家标准的必要。
但如果是公众应用软件,使用主流CA证书就可以避免安全防护软件的质疑询问,给用户的体验更良好。
假如要开发一个在iOS环境下运行的软件,就必须先向苹果公司旗下的CA申请数字证书。
当软件开发完成运行时,iOS系统会自动对软件内置的数字证书进行验证,以此确保系统的安全和稳定。
但为此,软件开发商需要付出更多的软件开发成本,用于支付购买各种证书的费用。
由此我们可以看出,使用数字证书,就是校验数字证书的过程。
CA签发过程:
1 .服务方 S 向第三方机构CA提交公钥、组织信息、个人信息(域名)等信息并申请认证;
注意:申请证书不需要提供私钥,确保私钥永远只能服务器掌握
2 .CA 通过线上、线下等多种手段验证申请者提供信息的真实性,如组织是否存在、企业是否合法,是否拥有域名的所有权等;
3 .如信息审核通过,CA 会向申请者签发认证文件-证书。
总结下:
证书=公钥+申请者与颁发者信息+签名
证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构 CA 的信息、有效时间、证书序列号等信息的明文,同时包含一个签名;
签名的产生算法:首先,使用散列函数计算公开的明文信息的信息摘要,然后,采用CA 的私钥对信息摘要进行加密,密文即签名;
CA证书验证过程:
1 .客户端 C 向服务器 S 发出请求时,S 返回证书文件;
2 .客户端 C 读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,用CA 的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性,即公钥合法;
3.客户端然后验证证书相关的域名信息、有效时间等信息;
4.客户端会内置信任 CA 的证书信息(包含公钥),如果CA不被信任,则找不到对应 CA 的证书,证书也会被判定非法。
-------------------------HTTPS相关-----------------------------
什么是HTTPS协议
可以理解为HTTP+SSL/TLS, 即 HTTP 下加入 SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL,用于安全的 HTTP 数据传输
http网络协议栈:
http |
tcp |
ip |
https 网络协议栈:
HTTP |
ssl |
tcp |
ip |
HTTPS 相比 HTTP 添加了SSL/TLS握手以及数据加密传输,也属于应用层协议。意味着每次通信都多走层SSL协议。SSL为数据通信提供安全保证。
SSL如何保证通信安全?
1 HTTP协议运行在TCP之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。
2 HTTPS是运行在SSL/TLS之上的HTTP协议,SSL/TLS运行在TCP之上。所有传输的内容都经过加密,具体通信内容采用对称加密(注意是对称加密),但对称加密的密钥用服务器方的证书进行了非对称加密。
接下来看下图,解释上文提到的通信内容采用的对称加密秘钥如何生成
前5步其实就是HTTPS的握手过程,这个过程主要是认证服务端证书(内置的公钥)的合法性。因为非对称加密计算量较大,整个通信过程只会用到一次非对称加密算法(主要是用来保护传输客户端生成的用于对称加密的随机数私钥)。后续内容的加解密都是通过一开始约定好的对称加密算法进行的。
有同学可能会疑惑为什么又多弄出个对称加密?
1 什么是对称加密? 是指加密和解密使用的密钥是同一个密钥,或者可以相互推算。
2 对称加密的优点? 是算法简单,加解密效率高,系统开销小,适合对大数据量加密。
3 对称加密的缺点? 是解密加密使用同一个密钥,需要考虑远程通信的情况下如何安全的交换密钥,如果密钥丢失,
所谓的加密解密就失效了。
4 结论: 由于非对称加密的计算量大,而且对字节数有一点限制,显然不适合对具体的通信过程做加密,这就引出了对称加密来提高通信效率。这其实是一个折中的设计
握手过程的简单描述:
1.客户端C 将自己支持的一套加密规则发送给服务端。
2.服务端S 从中选出一组加密算法与HASH算法,并将自己的身份信息以CA证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
3.客户端C 获得服务端S 证书之后浏览器要做以下工作:
a) 验证CA证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,如果客户端是浏览器,那么地址栏里面会显示一个小锁头,否则会给出证书不受信的提示。
b) 如果证书受信任,或者是用户接受了不受信的证书,客户端C 会生成一串随机数的密码,并用证书中提供的公钥加密。
c) 使用约定好的HASH计算握手消息,并使用生成的随机数密码对消息进行加密,最后将之前生成的所有信息发送给网站。
4.服务端S 接收 客户端C 发来的数据之后要做以下的操作:
a) 使用自己的私钥将信息解密取出客户端生成的随机密码R,使用该密R码解密浏览器发来的握手消息,并验证HASH是否与客户端C 发来的一致。
b) 使用密码加密一段握手消息,发送给客户端C。
5.客户端C 用R密码解密并计算握手消息的HASH,如果与服务端发来的HASH一致,
此时握手过程结束,之后所有的通信数据将由之前客户端C 生成的随机密码R并采用对称加密算法进行加密。
有同学疑惑为什么弄这么复杂的握手过程?
客户端C与服务端S互相发送加密的握手消息并验证,目的是为了保证双方都获得了一致的密码,并且可以正常的加密解密数据,为后续真正数据的传输做一次测试。由此可见TLS/SSL中使用了非对称加密,对称加密以及HASH算法。接下来再复盘下三者如何协同工作
HTTPS一般使用的加密与HASH算法如下:
非对称加密算法:RSA,DSA/DSS
对称加密算法:AES,RC4,3DES
HASH算法:MD5,SHA1,SHA256
其中非对称加密算法用于在握手过程中加密生成的密码,对称加密算法用于对真正传输的数据进行加密,而HASH算法用于验证数据的完整性。
由于客户端C 生成的密码是整个数据加密的关键,因此在传输的时候使用了非对称加密算法对其加密。
非对称加密算法会生成公钥和私钥,公钥只能用于加密数据,因此可以随意传输,而服务端S 的私钥用于对数据进行解密,所以服务端S都会非常小心的保管自己的私钥,防止泄漏。
TLS握手过程中如果有任何错误,都会使加密连接断开,从而阻止了隐私信息的传输。
-------------------------HTTPS服务搭建-----------------------------
说了那么对理论,接下来探讨如何搭建https 服务。公式: https = http+ssl.那么我们就需要在原有的http协议栈中添加SSL模块。接下来会举两个例子:tomcat 与 nginx 如何搭建来供参考