一直以来,都在享受着SSH免密码登录的远端服务器的好处,但总觉得对背后的逻辑不是太清楚,或者说,根本没有细想过,因为网上充斥了大量的,如何做,却不告诉为什么,下一次再去做的时候,又费半天功夫,所以有必要熟悉完整的流程。近来有了“深入理解加密、解密、数字签名和数字证书”这篇文章做底子,SSH免密码登录背后的逻辑也容易理解很多。
SSH协议的设计初衷是为rsh、rlogin、rcp等命令提供更佳安全的实现方案,需要对一切传输的数据进行加密、检验一致性。公钥系统中对大块的数据加密往往使用运算速度较快的对称密钥,在SSH协议中称作会话密钥。让彼此双方获得会话密钥,并且保证会话密钥不被窃听的过程称作建立安全会话。SSH-1建立安全会话的流程如下:
1. 客户端发起访问远端服务器的请求;
2. 服务器发回主机密钥、服务器密钥、加密算法、校验序列等信息;
3. 客户端接到传回信息后,进行服务器认证,如果传回的主机未知,需要人工判断是否信任这些信息,如果不信任,那么会话结束,否则,会话继续;
4. 服务器认证通过后,客户端随机生成会话密钥,用主机密钥和服务器密钥依次对会话密钥加密后发给服务器;
5. 服务器接到加密的会话密钥,用私有密钥依次解密得到会话密钥。
自此客户端和服务器都得到了会话密钥,接下来还需要进行客户端认证。客户端认证的方式有两种:口令认证和公钥认证。口令认证的方式流程如下:
1. 服务器没有找到用户密钥,就询问用户输入口令;
2. 用户输入口令后,经过会话密钥加密传回给服务器;
3. 服务器验证用户身份。
口令认证的方式简洁方便,但对每天需要登录很多不同的服务器的人而言,一遍遍重复输入口令比较繁琐,这种情况下采用公钥认证的方式会轻松许多,也更佳安全。公钥认证的方式流程如下:
1. 客户端将用户密钥传给服务器;
2. 服务器在认证过的密钥库中查找,如果没有找到,那么请求失败,如果找到则生成一段随机序列,称作质询,用用户密钥加密后,发回给客户端;
3. 客户端拿私有密钥解密得到质询,附带结合上会话的标识(主机密钥、服务器密钥和校验序列通过MD5散列后得到的序列)通过MD5散列后的序列作为响应传回给服务器;
4. 服务器用同样的方式如果计算出相同的MD5序列,则验证通过。
客户端在使用私有密钥时,需要私有密钥的口令,这个口令可以为空,这样就相当于免密码,但这种方式让私有密钥的安全性降低,不推荐这种做法。最佳实践是借助SSH代理,可以记住不同私有密钥的口令,当客户端查找私有密钥时,只需要通过SSH代理去完成,这样就避免了重复私有密钥口令。
以上文章只说明了公钥认证背后的流程,并未涉及为何要这样设计流程,比如为什么需要同时有主机密钥和服务器密钥,为什么需要会话标识,这一系列的设计背后都有原因,能够搞明白这些原因,才能更好理解安全是什么。本文只是粗略的总结,对每次传输的细节有些省略,也没有涉及SSH-1和SSH-2的差别以及一些更加丰富的客户端验证方法,更加深入的内容可以参考相关阅读的第一篇。
相关阅读
- SSH: The Secure Shell The Definitive Guide, Inside SSH-1 ⭐️⭐️⭐️⭐️⭐️
- 深入理解加密、解密、数字签名和数字证书?⭐️⭐️⭐️⭐️⭐️