目录

关于加密的二三事

  • 一种网络协议,存在多种实现
  • 用于远程登录
  • 中间人攻击 SSH协议的公钥是没有证书中心(CA)公证的,都是自己签发的。攻击者可截获登录请求,冒充远程主机,用伪造的公钥,获取用户的登录密码。
  • 公钥加密 (1)远程主机收到用户的登录请求,把自己的公钥发给用户。(2)用户使用这个公钥,将登录密码加密后,发送回来。(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。
  • 公钥指纹
$ ssh user@host

The authenticity of host 'host (12.18.429.21)' can't be established.

RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.

Are you sure you want to continue connecting (yes/no)?

RSA算法将公钥变成128位的指纹。当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts之中。此外系统也有一个这样的文件,通常是/etc/ssh/ssh_known_hosts。

  • 公钥登录 用户将自己的公钥储存在远程主机上,登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。
ssh-keygen

在$HOME/.ssh/目录下,会新生成两个文件:id_rsa.pub和id_rsa。

ssh-copy-id user@host

将公钥传送到远程主机host上面。

  • 用Hash生成摘要,对摘要用私钥加密,生成数字签名
  • 取出数字签名用公钥解密,将Hash后的结果与摘要对比
  • 自己保存的公钥可能会被换掉
  • 证书中心为公钥做认证,用自己的私钥,对待认证的公钥和相关信息一起加密,生成数字证书
  • 在签名的同时再附上数字证书
  • 用CA的公钥解开数字证书,拿到真实的公钥,证明数字签名的真实性
  • 客户端向服务器发出加密请求
  • 服务器用自己的私钥加密网页以后,连同本身的数字证书,一起发送给客户端
  • 客户端查看数字证书的公钥是否在证书管理器的列表中
  • 如果数字证书记载的网址,与正在浏览的网址不一致,浏览器会发出警告
  • 如果数字证书不是由收信人的机构颁发的,浏览器会发出另一种警告
  • 如果数字证书是可靠的,客户端就可以使用证书中的服务器公钥,对信息进行加密,然后与服务器交换加密信息
  • 加密通信前,客户端和服务器首先建立连接和交换参数,这个过程叫做握手
  • 客户端给出协议版本号、一个客户端生成的随机数(Client random),以及客户端支持的加密方法
  • 服务器确认双方使用的加密方法,并给出数字证书、以及一个服务器生成的随机数(Server random)
  • 如果服务器需要确认客户端的身份,就会要求客户端提供客户端证书
  • 客户端确认数字证书有效,然后生成一个新的随机数(Premaster secret),并使用数字证书中的公钥,加密这个随机数,发给服务器
  • 服务器使用自己的私钥,获取客户端发来的随机数(即Premaster secret)
  • 客户端和服务器根据约定的加密方法,使用前面的三个随机数,生成"对话密钥”(session key),用来加密接下来的整个对话过程
  • 握手之后的对话使用"对话密钥"加密(对称加密),服务器的公钥和私钥只用于加密和解密"对话密钥”(非对称加密),无其他作用。

SSL是HTTPS下的一个协议加密层,NetScape设计了SSL(安全套接字协议),互联网标准化组织ISOC接替NetScape公司发布了SSL的升级版TLS(传输层安全协议),Https是HTTP+SSL/TLS的简称