标签:免密 登录 server 会话 公钥 client 密钥 ssh
简介
总结主机之间使用ssh免密登录的原理。
ssh简介
Secure Shell,安全外壳协议,简称ssh。
ssh建立在应用层基础上,基于C/S结构,通过对密码进行加密传输验证,实现ssh客户端和ssh服务器端的安全连接。以下客户端(client)和服务器端(server)指的是ssh客户端和ssh服务器端。
ssh工作流程
根据上面对ssh的简介,可以知道ssh的要素是:连接、加密传输。
1、建立连接
- server开启22端口。
- client发起tcp请求,三次握手,与server建立连接。
- 建立连接后,server向client发送它当前使用的协议版本A。
- client根据A来决定使用哪个协议版本:如果A比client当前使用的协议版本低,并且client支持A,就决定使用A;否则,决定使用client当前使用的版本B。然后client回应server,告诉它决定使用的协议版本C。C=A or B。
- server判断是否支持C,如果不支持,就断开tcp连接。
通过以上步骤,就建立了一个普通的tcp连接,很明显这个连接现在是不安全的。
2、加密传输
ssh让连接安全的方法就是对数据加密,所以下一步是实现加密传输,可以分为生成安全会话、用户认证、交互传输三个过程。
生成安全会话
- server和client根据双方支持的算法列表来协商加密传输使用的加密算法、消息验证码算法、压缩算法。
- server和client通过DH交换算法、密钥对等等,生成会话密钥和会话 ID,双方后续将使用会话密钥在这个会话中进行。
上面过程其实就已经建立了一个安全的会话。但是注意,因为上述流程要通过密钥对生成会话密钥,所以在这一步之前,要保证server已经生成 RSA或DSA密钥对,server应该是会自动生成的。
用户认证
- client向server发送认证请求,认证请求信息中包含用户名、认证方法、这种认证方法需要的额外信息。
- server对client进行认证,如果失败就给client发送失败消息,然后重复这个认证过程,直到认证成功或到达上限后server关闭连接。
这一步其实就是防止陌生人登录server。其中涉及到了密码或者其它与安全相关的信息,所以它已经在安全会话中进行了。
交互传输
现在已经实现了安全传输,client也通过认证获得了server的信任,client就可以发送命令让server执行了。
- client给server发命令。
- server执行命令,把结果返回给client。
ssh免密登录原理
免密登录是为了解决client每次登录server都需要输密码的问题,原理是使用非对称加密让server认识与鉴别client身份。
认识client
- client生成自己的密钥对。
- 把client的公钥给server,server会把client的公钥存放到server的authorized_keys文件中。
让server认识client很简单,就是让server知道client的公钥就行了。注意,这一步一定是在ssh免密登录之前手动进行的。
鉴别client
当client登录时,server要看看是不是它认识的那个client。
- server生成一个随机数,用client的公钥加密后,发送给client。
- client用自己的私钥解密,然后用MD5把解密后的数据和会话密钥生成一个加密的摘要,再通过安全会话把给server。
- server从安全会话得到client的回应数据,然后也用MD5把原始数据和会话密钥生成加密的摘要,看看client和自己是不是一样的,如果是一样的,就通过了认证。
MD5把会话密钥和传输的数据联系到了一起,防止了数据在传输过程中被篡改。
鉴别server
上面server知道了client是真的client,但client不能保证server是真的server。
所以在首次登录不认识的server时,client会得到server的公钥指纹,并且收到警告,相当于让client来手动判断server的真假。确认以后,server的公钥指纹会被加入到client的known_hosts文件中。以后,client就能自动根据指纹进行比对了。
ssh免密登录操作
根据ssh的工作原理,可以知道免密登录需要在client上执行以下三步:
- client生成client端密钥对。使用
ssh-keygen
命令。 - 把client的公钥加入server的authorized_keys文件中。使用
ssh-copy-id
命令可以一键加入。 - 把server的公钥指纹加入client的known_hosts中。使用
ssh-keyscan
命令可以获取server的公钥指纹,然后加入到known_hosts文件中就可以了。
标签:免密,登录,server,会话,公钥,client,密钥,ssh 来源: https://www.cnblogs.com/kangyingjie/p/16259085.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。