跳转至

安全

计算机科学领域里的任何问题,都可以通过引入一个中间层来解决,如果一个中间层不行,那就再加一个中间层。

HTTPS就是在HTTP和TCP之间增加了SSL/TLS协议,以此来提高数据传输的安全性。

SSL/TLS最初叫做SSL(Secure Sockets Layer),是由网景公司发明,经历了v1~v3版本的迭代,然后改名为TLS(Transport Layer Security)继续迭代,目前最常用版本为TLSv1.2。

TLS 主要由记录协议、警报协议、握手协议、以及密码变更协议四个子协议组成,然后还依赖一些开源的密码学底层库(比如最常用的OpenSSL)实现各种加密算法等

20220103171609

根据加密与解密是否采用同一个密钥,现代密码学算法可分为:

  • 对称加密算法:效率高,但安全系数较低。
  • 非对称加密算法:效率低,但安全系数较高。

非对称加密算法将密钥分成公钥和私钥,公钥可以完全公开,无须保证传输安全。私钥由用户自行保管,不参与任何通信传输。

  • 加密:公钥加密,私钥解密。
  • 签名:私钥加密,公钥解密。

将数据用公钥加密,发送给私钥所有者,数据无法被他人解密,但可能被他人篡改,因为每个人都可以用公钥加密数据。

用私钥加密一段内容作为签名,每个拿到公钥的人都可以验证私钥所有者的身份,防止数据被篡改。

于是可以将加密与签名两种方式结合起来使用,通常用于传输对称加密的密钥。

加密

摘要

数字摘要(类似指纹)与加密的本质区别在于加密是可逆的,而摘要是不可逆的。

通常利用哈希算法的两个特性来生成摘要:

  • 易变性:两个不同的输入不会得到相同的输出
  • 不可逆性,无法从输出推算出输入

证书

为了证明公钥是可信的,引入了PKI(Public Key Infrastructure 公开密钥基础设施),由硬件、软件、参与者、管理政策与流程组成的基础架构,其目的在于创造、管理、分配、使用、存储以及撤销数字证书。

即通过CA(Certificate Authority 证书颁发机构)对公钥拥有者做专业认证,认证通过后颁发数字证书(digital certificate),将数字证书内置到操作系统,建立一个信任链,以此保证公钥的可信。

全球最大的七家CA:Comodo、Symantec、Trend Micro、DigiCert、Entrust、GlobalSign、GoDaddy

他们一起组成了证书颁发机构理事会(CASC),有点类似联合国安全理事会的感觉。另外还有一个叫做CA/Browser Forum(证书机构与浏览器论坛)的专业组织,主要使命是为浏览器和证书颁发机构提供互联网安全行业标准,通常也称为公钥基础设施,简称PKI。CASC的成员必须遵守CA/Browser Forum制定的标准,目前最新标准为X.509 v3。

多说一句,审核并不一定是要提交给最大的那几个CA,因为除了这些之外,还有一些大大小小的中介CA,他们会组成一条条信任链,通过信任链的层层认证,最终也会被信任。不过机构越权威,安全等级也就越高,但同时也需要付出更多的费用,是的,申请数字证书是要花钱的(也有免费的),而且还不便宜,因为这背后需要很多安全和法律成本,并不是随便一个机构就能搞定的事情。

CA按安全等级从低到高可分为:

  • DV:只验证申请域名的所有权
  • OV:需对申请者/组织的身份做验证
  • EV:需经过法律和审计的严格核查

CA按保护域名的数量分为:

  • 单域名版:只保护一个域名
  • 多域名版:保护多个域名
  • 通配符版:保护主域名下同一级的所有子域名

作为服务端/申请者,如果想让自己的公钥被客户端所信任,需要将公钥以及一些必要信息等制作成一个CSR(Certificate Signing Request 证书签发请求)文件,通过可信网络提交给CA审核。

CSR在线生成工具

CA审核通过后,会按照X.509标准的格式,将所有的必要信息通过哈希/散列函数压缩成一串固定长度的哈希值,称之为信息摘要。这是一个不可逆过程,如果信息被篡改,则哈希值会变,以此保障信息的完整性。

然后会通过CA私钥把这些信息和信息摘要一起进行加密,因为CA私钥由CA保管,所以没有私钥的人无法实现这一过程,所以称之为数字签名,至此就生成了一个可信赖的数字证书。

一个证书通常包含以下信息:

  • CA信息
  • CA的数字签名
  • CA生成证书所用的摘要和非对称签名算法
  • 持有者公钥匙
  • 持有者唯一标识符,通常为域名
  • 序列号,CA分配给证书的唯一标识符
  • 版本号,指出该证书使用了哪种版本的X.509标准
  • 有效期

20201026194030

最后,CA将数字证书颁发给申请者,申请者会将其部署到服务器中,在收到客户端请求后将数字证书返回,客户端收到数字证书后,会对数字证书进行验证。

可以看到github.com的颁发者和有效日期,然后把菜单切到“证书路径”tab下,这就是我们前文提到的信任链,通过这个层级结构,就可以知道github.com的颁发者是由DigiCert这个CA认证的,也就是我们前文提到的全球最大CA之一,那么这些顶级的CA机构是由谁认证呢,答案是他们自己给自己认证,当然前提是因为这些顶级机构有足够的实力和信誉我们才选择相信他,就像各个国家的中央机构,你只能选择相信,不然整个社会体制就无法正常运转下去,言归正传,这些顶级CA会给自己签发一个数字证书,通常被称为根证书,这些根证书会被预置在我们的操作系统以及浏览器中,系统会定期检查他们是否已被吊销,尽可能保持最新可信状态。

所以不要轻易安装盗版操作系统,因为如果从根儿上就已经不安全了,那么整个信任链也就没有安全可言。

证书

TLS四次握手

客户端会和服务端共同商议出使用什么对称加密算法

TLS 收发数据的基本单位:记录(record)

具体的流程可以参照这个流程图来看

x

以上流程只有客户端对服务端做了认证,而服务端没有对客户端的身份做认证,称之为单向认证。但通常单向认证通过后就已经建立了安全通信,用账号、密码等手段就能够确认用户的真实身份。但为了防止账号、密码被盗,有时(比如网上银行)还会使用U盾给用户颁发客户端证书,实现“双向认证”,这样会更加安全。


最后更新: 2022-01-10