一、SSH
1、概述
SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。简单说,SSH 是一种网络协议,用于计算机之间的加密登录。
最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑。1995年,芬兰学者 Tatu Ylonen 设计了 SSH 协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为 Linux 系统的标准配置。如果要在 Windows 系统中使用 SSH,会用到另一种软件 PuTTY。
SSH 之所以能够保证安全,原因在于它采用了公钥加密。
2、过程
(1)远程主机收到用户的登录请求,把自己的公钥发给用户。
(2)用户使用这个公钥,将登录密码加密后,发送回来。
(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。
3、中间人攻击与解决办法
(1)什么是中间人攻击?
中间人收到远程主机公钥之后,冒充远程主机将伪造的公钥发给用户,用户将很难辨别真伪,用户用伪造的公钥加密时会被中间人截获,会出现安全漏洞。因为不像 https 协议,SSH 协议的公钥是没有证书中心(CA)公证的,也就是说,是自己签发的。
(2)解决办法:
如果是第一次登录对方主机,系统会出现下面的提示:
$ 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)?
表示无法确认 host 主机的真实性,只知道它的公钥指纹是***,接受输入yes?
所谓"公钥指纹",是指公钥长度较长(这里采用RSA(Rivest-Shamir-Adleman一直非对称加密算法),长达1024位),很难比对,所以对其进行 MD5 计算,将它变成一个128位的指纹。
上例中是 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d 以简化对比。远程主机必须在自己的网站上贴出公钥指纹,以便用户自行核对。
输入 yes 后,出现:
Warning: Permanently added 'host,12.18.429.21' (RSA) to the list of known hosts.
然后,会要求输入密码。如果密码正确,就可以登录了。
当远程主机的公钥被接受以后,它就会被保存在文件 $HOME/.ssh/known_hosts 之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。
每个 SSH 用户都有自己的 known_hosts 文件,此外系统也有一个这样的文件,通常是 /etc/ssh/ssh_known_hosts,保存一些对所有用户都可信赖的远程主机的公钥。
二、使用场景
1、远程登陆
SSH 主要用于远程登录。假定你要以用户名 user,登录远程主机 host,只要一条简单命令就可以了。
$ ssh user@host
如果本地用户名与远程用户名一致,登录时可以省略用户名。
$ ssh host
SSH 的默认端口是 22,也就是说,你的登录请求会送进远程主机的 22 端口。使用 p 参数,可以修改这个端口。
$ ssh -p 2222 user@host
上面这条命令表示,ssh 直接连接远程主机的 2222 端口。
2、SSH key 登陆
使用密码登录,每次都必须输入密码,非常麻烦。SSH提供了公钥登录,可以省去输入密码的步骤
用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。
这种方法要求用户必须提供自己的公钥。如果没有现成的,可以直接用 ssh-keygen 生成一个:
$ ssh-keygen
其中一步是私钥设置口令(passphrase),如果担心私钥的安全,这里可以设置一个。
运行结束以后,在 $HOME/.ssh/ 目录下,会新生成两个文件:id_rsa.pub 和 id_rsa。前者是你的公钥,后者是你的私钥。
这时再输入下面的命令,将公钥传送到远程主机 host 上面:
$ ssh-copy-id user@host
好了,从此你再登录,就不需要输入密码了。
如果还是不行,就打开远程主机的 /etc/ssh/sshd_config 这个文件,检查下面几行前面"#"注释是否取掉。
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
然后,重启远程主机的ssh服务。
// ubuntu系统
service ssh restart
// debian系统
/etc/init.d/ssh restart
3、使用 git gui 生成公钥私钥
git Gui>Help>Show ssh key > generate
产生的 keys 存储在 Users/Username/.ssh 文件夹中。
4、其他
win10 使用 git clone ssh://user@host/**/**.git 的时候报错 no matching key exchange method found. Their offer: diffie-hellman-group1-sha1
解决: 在 windows Users/Username/.ssh 中添加一个名为 config 的文件,中间填上
Host infrashdev003.sh.intel.com
KexAlgorithms +diffie-hellman-group1-sha1
(SAW:Game Over!)