SSL证书加密原理

前言
整理一下https的ssl证书信任以及加密流程


证书签发机构 CA

CA(Certificate Authority)是证书的签发机构,它是负责管理和签发证书的第三方机构,是受到广泛信任的机构。一般在的电脑中,浏览器里,或者手机里都会内置一批这样的受信机构的根证书。


证书信任链

CA机构签发了一份证书A 这份证书A信任B证书, 另外B证书又信任了其他的C证书......那么这条链条下去的都可以信任。一旦CA机构的根证书不可信,那么所有他签发出来的证书将全部不可信。


公钥密码体制

公钥密码体制分为: 公钥、私钥、加密解密算法,它的加密解密过程如下:

  • 加密:通过加密算法和公钥对内容(明文)进行加密,得到密文。加密过程需要用到公钥
  • 解密:通过解密算法和私钥对密文进行解密,得到明文。解密过程需要用到解密算法和私钥。注意,由公钥加密的内容,只能由私钥进行解密,也就是说,由公钥加密的内容,如果不知道私钥,是无法解密的。
  • 公钥密码体制的公钥和算法都是公开的,私钥是保密的。大家都可以使用公钥进行加密,但是只有私钥的持有者才能解密。在实际的使用中,有需要的人会生成一对公钥和私钥,把公钥发布出去给别人使用,自己保留私钥。

CA证书

CA证书就是由CA机构签发的证书。其实证书谁都可以签,A也可以给A自己签发证书,但是由于A并不是被广泛信任的机构,所以A自己签发的证书并没有什么用。公网也不会信任A的证书。
服务器证书包括以下几种信息:

  • 证书的发布机构:
    指明这个证书是哪个公司创建的(只是创建证书,不是指证书的使用者)
  • 证书的有效期:
    证书的使用期限。 过了有效期限,证书就会作废
  • 公钥
    公钥是用来对消息进行加密的
  • 证书所有者(Subject)
    这个证书是发布给谁的,一般是某个人或者某个公司名称、机构的名称、公司网站的网址等
  • 签名所使用的算法
    就是指的这个数字证书的数字签名所使用的加密算法,这样就可以使用证书发布机构的证书里面的公钥,根据这个算法对指纹进行解密。指纹的加密结果就是数字签名
  • 指纹以及指纹算法
    用来保证证书的完整性,也就是说确保证书没有被修改过。 其原理就是在发布证书时,发布者根据指纹算法(一个hash算法)计算整个证书的hash值(指纹)并和证书放在一起,使用者在打开证书时,自己也根据指纹算法计算一下证书的hash值(指纹),如果和刚开始的值对得上,就说明证书没有被修改过,因为证书的内容被修改后,根据证书的内容计算的出的hash值(指纹)是会变化的。 注意,这个指纹会使用"CA"证书机构的私钥用签名算法(Signature algorithm)加密后和证书放在一起。

CA如何给我们签发一个有效证书:

假设我们公司"ABC Company"花了1000块钱,向一个证书发布机构"SecureTrust CA"为我们自己的公司"ABC Company"申请了一张证书,注意,这个证书发布机构"SecureTrust CA"是一个大家公认并被一些权威机构接受的证书发布机构,我们的操作系统里面已经安装了"SecureTrust CA"的证书。"SecureTrust CA"在给我们发布证书时,把Issuer,Public key,Subject,Valid from,Valid to等信息以明文的形式写到证书里面,然后用一个指纹算法计算出这些数字证书内容的一个指纹,并把指纹和指纹算法用自己的私钥进行加密,然后和证书的内容一起发布,同时"SecureTrust CA"还会给一个我们公司"ABC Company"的私钥给到我们。我们花了1000块钱买的这个证书的内容如下:

×××××××××××××××证书内容开始×××××××××××××××××
Issuer : SecureTrust CA
Subject : ABC Company
Valid from : 某个日期
Valid to: 某个日期
Public Key : 一串很长的数字
…… 其它的一些证书内容……

{证书的指纹和计算指纹所使用的指纹算法}[SecureTrust CA的私钥|RSA] //这个就是"SecureTrust CA"对这个证书的一个数字签名,表示这个证书确实是他发布的,有什么问题他会负责(收了我们1000块,出了问题肯定要负责任的)


使用https的时候究竟发生了什么
  1. 客户端向一个需要https访问的网站发起请求
  2. 服务器将证书发送给客户端进行校验。证书里面包含了其公钥
  3. 客户端收到证书之后进行校验
  4. 客户端首先在本地电脑寻找是否有这个服务器证书上的ca机构的根证书。如果有继续下一步,如果没有弹出警告。
  5. 客户端使用ca机构根证书的公钥对服务器证书的指纹和指纹算法进行解密
  6. 客户端得到指纹算法之后,拿着这个指纹算法对服务器证书的摘要进行计算得到指纹
  7. 客户端将计算出的指纹和从服务器证书中解密出的指纹对比看是否一样如果一样则通过认证
  8. 客户端校验成功之后,客户端会生成一个随机串然后使用服务器证书的公钥进行加密之后发送给服务器
  9. 服务器通过使用自己的私钥解密得到这个随机值
  10. 服务器从此开始使用这个随机值进行对称加密开始和客户端进行通信
  11. 客户端拿到值用对称加密方式 使用随机值进行解密