网络安全是当前收到关注的一个问题,大部分站点都是https来实现自己的数据安全的。那么怎么样才能把自己的站点变成https站点呢?我们需要了解SSL协议。
SSL的全称是(secure sockets layer),而现在我们很多时候在使用TLS(transport layer security)。我们简单看一下它的发展过程。
SSL协议是由网景公司在1995年推出的,那么在3.0获得了一个非常大的一个发展,但是接下来,微软把它的ie浏览器捆绑windows,一起卖出以后呢。导致网景遇到了很大的一个困境,网景在把SSL协议交给IETF组织以后呢,在1999年,应微软的要求,IETF把SSL改名为TLS1.0。后面在06年、08年到18年,TLS分别发展了1.1,1.2,1.3协议。那么TLS协议,究竟是怎样保证HTTP的明文消息被加密的呢?我们可以看一下TLS的通用模型,在OSI七层模型中,应用层是HTTP协议,那么HTTP协议之下,我们的表示层,也就是SSL协议所发挥作用的这一层,它通过握手、交换密钥、告警、对称加密的方式,使HTTP层没有感知的情况下,做到了数据的安全加密。那么TLS究竟是怎样做到了数据的安全加密的呢?
我们可以看一下TLS的安全密码套件。当我们抓包,或者观察服务器端的配置时,我们可以看到类似于这张图中的这样的一个配置。
1 | TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 |
这个安全密码的配置呢,它决定了我们的TLS协议是怎样保证明文被加密的。
这里大概有四个组成部分,第一个组成部分叫密钥交换,也就是ECDHE,这实际上是一个椭圆曲线加密算法的表达,密钥交换是为了解决浏览器和服务器之间是怎样各自独立的生成密钥,而最后生成的密钥,是相同的。接下来它们会用这个密钥去加密数据,那么在密钥交换这个过程中呢,我们需要去让各自双方去验证对方的身份,而验证身份,是需要一个算法,而这个算法叫RSA。它用于身份验证。接下来我们执行数据加密解密这样的通讯的时候呢,我们需要用到对称加密算法,而对称加密算法AES_128_GCM就是表达这样的一个对称加密算法,其中第一个部分AES它表达了是怎样一种算法,第二个部分128它表示了AES算法里支持了三种加密强度,那么我们使用了128位这样的一个加密强度。那么AES中,它有很多分组模式,其中GCM是比较新的一种分组模式,它可以提高多核CPU情况下加密和解密的一个性能。SSA256是一个摘要算法,它用来把不定长度的字符串,生成固定长度的更短的一个摘要。
那么,以上是TLS算法的一个概要介绍。之后我们再来看一下对称加密算法和非对称加密算法有什么不同。
在对称加密这样的一个场景中,是两个想要通信的人bob和alice共同持有同一把密钥,那么bob可以把原始明文的文档通过这一把密钥加密生成一个密文文档,而alice拿到这个密文文档以后呢,他用这把密钥还原,转化为原始的明文文档,而中间的任何人,如果没有持有这把密钥,即使他知道了对称加密的算法,他也没有办法把密文还原成原始文档,对称加密究竟是怎么实现的呢?
我们可以以RC4这样一个对称加密的序列算法,来看一下。
1010 密钥序列(共同持有密钥)
异或
0110 明文
等于
1100 密文
异或有一个对称的特性。
对称加密,性能非常的好,加密解密都只需要遍历一次。
而非对称加密性能就会差很多。
我们看一下非对称加密的算法,它根据一个数学原理啊,它会生成一对密钥。这一对密钥中,如果我们称其中的一个叫做公钥,那么另一个就叫做私钥,那么公钥和私钥有什么特性呢,就是同一份明文文档,如果用公钥加密,如果用公钥加密,那么只有用私钥才能解密,同样的道理,如果文档用私钥加密了,用公钥才能解密,可能大家有些疑惑。那么我们来说一下具体的场景。
比如说alice他有一对公钥和私钥,那么他就可以把他的公钥发布给大家,比如bob是其中一个人,他拿到了alice的公钥,那么这个时候的加密操作是怎么做的呢?比如bob如果想传递一份原始文档给alice,那么bob就拿到alice的公钥,对于原始文档进行加密,把密文再发送给alice,alice拿他的私钥才能进行解密,其他人用了公钥以后都没有办法解密。那么公钥和私钥还有第二种用法,就是身份验证,比如现在有一段信息,alice用他的私钥,进行了加密,然后把密文发给了bob或者任何人,只要bob拿到了alice的公钥,因为公钥本身就是公开的,那么用公钥能成功的解开这段密文,就证明这段密文确实是由alice发出的,这为我们接下来TLS的密钥交换算法提供了基本的签名保障。
以上就是对称加密和非对称加密的基本原理。
SSL证书的公信力
在之前的加密过程中,我们谈到了Alice和bob中间进行通信,但其实它们有一个前提条件,alice必须知道,bob就是bob,也就是他收到的信息,必须是bob发来的。那么这样的一个新的问题,在多方通信的过程中,必须有一个公信机构,这样的一个机构就是CA机构。接下里我们就来看看CA是怎么样颁发证书以及怎么样让证书过期的。
那么,CA就是CA机构,我们作为一个站点的维护者,我们就是一个证书的订阅人,首先我们必须去申请一个证书,为了申请这个证书,我们可能必要登记,我是谁,我属于什么组织,我想做什么。到了登记机构,通过CSR(request certificate issuance, CSR)发给CA,那么CA中心通过以后呢,它会去生成一对公钥和私钥,那么公钥会在CA的证书之内保存着呢,私钥证书订阅人拿到以后,就会把它部署到自己的web服务器中,比如说nginx。当浏览器通过第一步,访问我们的https站点的时候,那么它会去请求我们的证书,而nginx这样的web服务器,会把我们的公钥证书发给我们的浏览器,而浏览器需要去验证我们的证书是不是合法有效的,但是如果我们用lets encrypt我们会发现,这个证书只有三个月的有效期,如果通过大部分其他SSL CA这样的颁发证书,一般是一年的有效期,那么这个有效期是怎样体现的呢?那么CA中心会把过期的证书放到CRL服务器,这个服务器会把所有过期的证书形成一条链条,所以它的性能非常的差。所以它又推出了一个OCSP程序,OCSP可以就一个证书去查询它是否过期。所以浏览器是可以去直接去查询OCSP响应程序的。但OCSP性能还不是很高,所以往往,比如我们的nginx,会有一个OCSP的开关,当我们打开开关以后,会由nginx主动的去OCSP去查询,这样大量的客户端就可以直接从nginx获取到证书是否有效。
那么证书究竟是怎样组成的呢?接下来,我们看一下证书究竟有哪几种类型。第一种证书叫做域名验证DV,也就是说这个整数,它只会去验证我们域名的归属是否正确。比如我们在lets encrypt申请证书的时候会发现。只要你的域名指向的服务器是你正在申请证书的服务器,那你就可以成功的申请到证书。如果你使用其他的一些CA机构颁发的一些证书,可能会去验证你注册的那个邮箱是否正确。第二种证书叫做组织验证,OV验证证书,组织验证呢就是我们在申请证书的时候会去验证我们填写的机构企业名称是否是正确的,所以OV证书的申请往往需要几天的时间,不像DV证书,基本上实时就可以获取到了。而OV证书他的价格,也要远远高于DV证书。DV证书很多都是免费的。那么,比OV证书做了更严格的验证,就是扩展验证EV证书,因为EV证书做了更严格的验证,所以大部分浏览器会对EV证书的显示非常的友好,它会把我们申请证书时所填写的机构名称,在浏览器的地址栏中的,最左侧显示出来。而对DV或者OV证书,浏览器是没有这个优待的。
那么,我们获取到这样的证书之后,究竟是怎样生效的呢?浏览器实际上从安全角度来说对DVOV或者EV证书,它的效果是一样的。