文章来源

最近跟菊厂合做,我司向他们提供SAAS服务。但因为他们对服务安全管控比较严格,内部有专门部门去审核上线的服务。所以菊厂派人来我司专门对安全这块作全面排查,期间加了很多班。其中他们提到了对HTTPS密码套件作配置,当初只知道HTTPS握手后须要非对称加密的算法,后面查询了才知道原来还有这一系列的通信过程当中使用的密码算法。特此写下文章做为学习记录。html

HTTPS简介

HTTPS是Hyper Text Transfer Protocol Secure的缩写。是一个计算机系统间进行安全通讯的协议,主要用在浏览器和web服务器之间进行通讯。HTTP使用明文进行数据传输,而HTTPS则使用加密数据进行传输
HTTPS能够有效防止黑客在浏览器和web服务器之间窃取和修改数据,即便黑客获取到这些数据,因为数据已经被加密,对黑客来讲实际上是垃圾数据。
HTTPS使用SSL(Secure Socket Layer)或者TLS(Transport Layer Security)协议来创建起浏览器和web服务器之间的加密链接。golang

握手过程

Client randomServer randomPremaster secretPremaster secret
session key

、算法

CA证书认证流程

在服务端发送CA证书给客户端后,客户端须要进行一系列的验证。浏览器

CA证书简介

CA证书其实就是第三方机构,做用是检查证书持有者身份的合法性,并签发证书,以防证书被伪造或篡改。咱们都知道CA证书是用来验证网站的安全性,其实,证书除了能够用来验证某个网站,还能够用来验证某个文件是否被篡改。
因为证书所涉及面太宽广,里面涉及到如何签发、格式规范等。本文不作过多涉及。安全

证书内容

  • 证书颁发机构的名称
  • 证书自己的数字签名
  • 证书持有者公钥
  • 证书签名用到的Hash算法
  • ...

认证流程

  1. 首先浏览器读取证书中的证书全部者、有效期等信息进行一一校验。浏览器开始查找操做系统中已内置的受信任的证书发布机构CA,与服务器发来的证书中的颁发者CA比对,用于校验证书是否为合法机构颁发
  2. 若是找不到,浏览器就会报错,说明服务器发来的证书是不可信任的。
  3. 若是找到,那么浏览器就会从操做系统中取出颁发者CA 的公钥,而后对服务器发来的证书里面的数字签名进行解密
  4. 浏览器使用相同的hash算法计算出服务器发来的证书的hash值,将这个计算的hash值与证书中签名作对比
  5. 对比结果一致,则证实服务器发来的证书合法,没有被冒充
  6. 此时浏览器就能够读取证书中的公钥,用于后续加密了

密码学套件

简介

密码套件分为三大部分:密钥交换算法,数据加密算法,消息验证算法(MAC,message authentication code)。密钥交换算法用于握手过程当中创建信道,通常采用非对称加密算法。数据加密算法用于信道创建以后的加密传输数据,通常采用对称加密算法。MAC顾名思义是一种哈希,用于验证消息的完整性,包括整个握手流程的完整性(例如TLS握手的最后一步就是一个对已有的握手消息的全盘哈希计算的过程)。服务器

获取本机支持套件

#openssl ciphers -V

密码套件名详解

RSA, DH, ECDH, ECDHERSA, DSA, ECDSA

握手过程详解

客户端发出请求
ClientHello
因为客户端(如浏览器)对一些加解密算法的支持程度不同,可是在TLS协议传输过程当中必须使用同一套加解密算法才能保证数据可以正常的加解密。在TLS握手阶段,客户端首先要告知服务端,本身支持哪些加密算法,因此客户端须要将本地支持的加密套件(Cipher Suite)的列表传送给服务端。除此以外,客户端还要产生一个随机数,这个随机数一方面须要在客户端保存,另外一方面须要传送给服务端,客户端的随机数须要跟服务端产生的随机数结合起来产生后面要讲到的 Master Secret 。
综上,在这一步,客户端主要向服务器提供如下信息:dom

  • 支持的协议版本,好比TLS 1.0版
  • 一个客户端生成的随机数,稍后用于生成"对话密钥"
  • 支持的加密方法,好比RSA公钥加密
  • 支持的压缩方法
PreMaster Secret
  • 确认使用的加密通讯协议版本,好比TLS 1.0版本。若是浏览器与服务器支持的版本不一致,服务器关闭加密通讯
  • 一个服务器生成的随机数,稍后用于生成"对话密钥"
  • 确认使用的加密方法,好比RSA公钥加密
  • 服务器证书
PreMaster SecretSession Secret

golang中配置ssl

tlsconf := &tls.Config{
        InsecureSkipVerify:       true,
        MaxVersion:               tls.VersionTLS13,
        MinVersion:               tls.VersionTLS12,
        PreferServerCipherSuites: true,
}
tlsconf.CipherSuites = []uint16{
        tls.TLS_AES_128_GCM_SHA256,
        tls.TLS_CHACHA20_POLY1305_SHA256,
        tls.TLS_AES_256_GCM_SHA384,
        tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
        tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
        tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
        tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
        tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
        tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
        tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
        tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
        tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
        tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
        tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
        tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
}

参考文章