<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Ssh on 有点稳</title><link>https://blog.nicelylit.net/tags/ssh/</link><description>Recent content in Ssh on 有点稳</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Wed, 12 Oct 2016 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.nicelylit.net/tags/ssh/index.xml" rel="self" type="application/rss+xml"/><item><title>公开密钥加密在SSH远程登录中的应用</title><link>https://blog.nicelylit.net/posts/%E5%85%AC%E5%BC%80%E5%AF%86%E9%92%A5%E5%8A%A0%E5%AF%86%E5%9C%A8ssh%E8%BF%9C%E7%A8%8B%E7%99%BB%E5%BD%95%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8/</link><pubDate>Wed, 12 Oct 2016 00:00:00 +0000</pubDate><guid>https://blog.nicelylit.net/posts/%E5%85%AC%E5%BC%80%E5%AF%86%E9%92%A5%E5%8A%A0%E5%AF%86%E5%9C%A8ssh%E8%BF%9C%E7%A8%8B%E7%99%BB%E5%BD%95%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8/</guid><description>&lt;p&gt;一直以来，都在享受着SSH免密码登录的远端服务器的好处，但总觉得对背后的逻辑不是太清楚，或者说，根本没有细想过，因为网上充斥了大量的，如何做，却不告诉为什么，下一次再去做的时候，又费半天功夫，所以有必要熟悉完整的流程。近来有了“&lt;a class="link" href="http://blog.csdn.net/sszgg2006/article/details/8199175" target="_blank" rel="noopener"
 &gt;深入理解加密、解密、数字签名和数字证书&lt;/a&gt;”这篇文章做底子，SSH免密码登录背后的逻辑也容易理解很多。&lt;/p&gt;
&lt;p&gt;SSH协议的设计初衷是为rsh、rlogin、rcp等命令提供更佳安全的实现方案，需要对一切传输的数据进行加密、检验一致性。公钥系统中对大块的数据加密往往使用运算速度较快的对称密钥，在SSH协议中称作会话密钥。让彼此双方获得会话密钥，并且保证会话密钥不被窃听的过程称作&lt;strong&gt;建立安全会话&lt;/strong&gt;。SSH-1建立安全会话的流程如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;客户端发起访问远端服务器的请求；&lt;/li&gt;
&lt;li&gt;服务器发回主机密钥、服务器密钥、加密算法、校验序列等信息；&lt;/li&gt;
&lt;li&gt;客户端接到传回信息后，进行&lt;strong&gt;服务器认证&lt;/strong&gt;，如果传回的主机未知，需要人工判断是否信任这些信息，如果不信任，那么会话结束，否则，会话继续；&lt;/li&gt;
&lt;li&gt;服务器认证通过后，客户端随机生成会话密钥，用主机密钥和服务器密钥依次对会话密钥加密后发给服务器；&lt;/li&gt;
&lt;li&gt;服务器接到加密的会话密钥，用私有密钥依次解密得到会话密钥。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;自此客户端和服务器都得到了会话密钥，接下来还需要进行&lt;strong&gt;客户端认证&lt;/strong&gt;。客户端认证的方式有两种：口令认证和公钥认证。口令认证的方式流程如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;服务器没有找到用户密钥，就询问用户输入口令；&lt;/li&gt;
&lt;li&gt;用户输入口令后，经过会话密钥加密传回给服务器；&lt;/li&gt;
&lt;li&gt;服务器验证用户身份。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;口令认证的方式简洁方便，但对每天需要登录很多不同的服务器的人而言，一遍遍重复输入口令比较繁琐，这种情况下采用公钥认证的方式会轻松许多，也更佳安全。公钥认证的方式流程如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;客户端将用户密钥传给服务器；&lt;/li&gt;
&lt;li&gt;服务器在认证过的密钥库中查找，如果没有找到，那么请求失败，如果找到则生成一段随机序列，称作质询，用用户密钥加密后，发回给客户端；&lt;/li&gt;
&lt;li&gt;客户端拿私有密钥解密得到质询，附带结合上会话的标识（主机密钥、服务器密钥和校验序列通过MD5散列后得到的序列）通过MD5散列后的序列作为响应传回给服务器；&lt;/li&gt;
&lt;li&gt;服务器用同样的方式如果计算出相同的MD5序列，则验证通过。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;客户端在使用私有密钥时，需要私有密钥的口令，这个口令可以为空，这样就相当于免密码，但这种方式让私有密钥的安全性降低，不推荐这种做法。最佳实践是借助SSH代理，可以记住不同私有密钥的口令，当客户端查找私有密钥时，只需要通过SSH代理去完成，这样就避免了重复私有密钥口令。&lt;/p&gt;
&lt;p&gt;以上文章只说明了公钥认证背后的流程，并未涉及为何要这样设计流程，比如为什么需要同时有主机密钥和服务器密钥，为什么需要会话标识，这一系列的设计背后都有原因，能够搞明白这些原因，才能更好理解安全是什么。本文只是粗略的总结，对每次传输的细节有些省略，也没有涉及SSH-1和SSH-2的差别以及一些更加丰富的客户端验证方法，更加深入的内容可以参考相关阅读的第一篇。&lt;/p&gt;
&lt;h3 id="相关阅读"&gt;相关阅读
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="http://docstore.mik.ua/orelly/networking_2ndEd/ssh/ch03_04.htm" target="_blank" rel="noopener"
 &gt;&lt;em&gt;SSH: The Secure Shell The Definitive Guide&lt;/em&gt;, Inside SSH-1&lt;/a&gt; ⭐️⭐️⭐️⭐️⭐️&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://blog.csdn.net/sszgg2006/article/details/8199175" target="_blank" rel="noopener"
 &gt;深入理解加密、解密、数字签名和数字证书&lt;/a&gt;?⭐️⭐️⭐️⭐️⭐️&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>