我使用ssh也不是一天两天了,几年前我第一次使用ssh连接到服务器开始,就被告知服务器类似11:11:11…的一个数字串很重要,第一次连接会告知是否接受这个数字串,点击yes之后除非服务器重装否则不应该再看到这个提示,否则就是存在中间人攻击。那么这个东西是什么?它如何避免中间人攻击?我过去一直认为这东西是对服务器整个进行扫描生成的对服务器唯一的标识码,每台服务器都应该不同。那么这种说法是否正确?要说明白这件事,首先要从ssh协议的原理说起。
讨论ssh原理的文章很多,可以随便到网上找。我大致说明一下:ssh协议,以及https常用的ssl等等,很多现代加密协议,都基于“非对称金钥加密系统”。这个系统是什么?总的来说,就是通过随机算法,一次生成一对钥匙,一把称为公钥,一把称为私钥。公钥是可以告诉任何人的,私钥必须保密。这2把钥匙,都是长长的一串字母和数字。
1.通过一把钥匙加密的数据,只能通过另一把解密。
2.通过一把钥匙,无法反推去计算出另一把钥匙。
这2点是金钥系统的基础,至于为啥,这得去问该死的数学家,咱不懂。客户端发起ssh连接时,向服务器发送一个要开始连接的明文信号,服务器把公钥明文发送给客户端。客户端把自己的公钥,用服务器的公钥加密,再发送回去,服务器收到后,用自己的私钥解密,验证用户身份后建立连接。
你就明白了。在整个过程中,被传输的只有公钥,私钥是不传输的,中间即使有任何人拦截了数据包,因为他不知道私钥,所以无法对数据解密。那么ssh的中间人攻击又是怎么回事呢?假设有某个该死的如什么强想嗅探你的数据,夹在你和服务器之间,第一步,你向服务器发起连接,,服务器给你公钥,某强拦截了这个包,然后把自己的公钥冒充服务器的发给你,你用这个假的公钥加密后发出去,某强拦到包,就可以用自己的私钥解密。
所以就明白了。第一次连接到服务器问你对不对的那货,就是公钥。而不是什么服务器唯一标识,说到底这玩意儿根本不存在。公钥一点不神秘,他就是/etc/ssh下的一个文件,由ssh-keygen命令随机生成。所谓只有重装等等才会变更是不对的。正确的说法是,他是sshd用于验证身份的文件,如果删除它,重启sshd,就会生成新的公钥。重装会变更是因为重装删除了所有文件。
中间人攻击为何必须换自己的公钥发给你呢,因为他无法反推计算出解密用的私钥。如果用原公钥的话,整个过程他是无法解密的。所以就明白额,公钥的重要性。可以说整个ssh协议,或者网银用的ssl协议,都基于公钥的正确性。一般的建议做法是通过其他渠道,电话,甚至当面传递公钥。而网银或者说https则是在浏览器预先内置数字证书,确保公钥万无一失。当然,如果你或者服务器其中之一被攻陷,私钥泄露的话,那么任何协议都无安全可言。
那么如何查看公钥呢?
如果管理员公开了他的公钥,那自然好说。否则,/etc/ssh/sshd_host-ras_key.pub,类似文件,有三个,分别代表三种算法。这个文件,cat是长长一串字母数字,有2048位,可以认为是很难读的。ssh-keygen -lf file可以读出他的fingerprint,就是链接时让你确认那个。
连接过的服务器的公钥存放在~/.ssh/known_host类似一个名字下。如果echo ” > known_host 那么所有服务器连接时都会重新问