什么是SSH?
简而言之,SSH 是一种网络协议,这里借用百度解释 ,SSH 为 secure shell 的简写,翻译过来呢就是安全外壳, 是较可靠的一种专为远程登录会话和其他网络服务提供安全性的协议,主要用于防止一些远程管理过程中的信息泄漏。其实吧,SSH只是一种协议,存在多种实现,而这里讲的是OpenSSH,也是目前Linux系统的标准配置,SSH的一个开源实现。
原理
SSH目前用的最多的就是远程登录,也就是计算机之间的远程操作。
Linux 命令行操作如下:
$ ssh -p port username@host
SSH保证安全的机制在于其登录机制:
1. 密码登录(口令登录)
如果是第一次登录该主机:
$ ssh -p 22 username@host
The authenticity of host 'host (xx.xx.xxx.xx)' can't be established.
RSA key fingerprint is .......
Are you sure you want to continue connecting (yes/no)?
意思就是,无法确认该主机的身份,然后显示出它的 RSA 公钥指纹,是否继续链接?
如果 yes,那么系统就会将该 host 主机认可,存入到已知主机列表里,之后再输入密码,即可登录。
这里的公钥指纹,便是辨识该主机的标志,这里的 RSA 公钥指纹,便是利用 RSA 算法处理后(长度较长,1024位),再进行 MD5 计算后得到的,128位指纹(更利于比对)。
host 主机被认可,其公钥会被存储在 ~/.ssh/known_hosts 中,下一次登录时,系统会从该文件中识别出该主机,不会再次警告,直接输入密码即可。
同时,主机的 /etc/ssh/ 中还会存储 host_key ,即一些已经识别的可信赖的主机公钥。
2. 公钥登录
当然,密码登录(口令登录),比较麻烦。所以就提供了公钥登录,原理也很简单,也就是公钥加密原理的一些应用:
localhost (本地主机)生成公钥,远程存储在 host(远程主机) 上,当 localhost 需要远程登录 host 时,host 会发送一段随机字符串返回给 localhost,localhost 利用自己的私钥加密后,再返回给 host,host 利用存储的 localhost 公钥解密,解密结果 与原发送字符串结果相同,则认可 localhost 身份,则可直接登录,不需要密码。
注:私钥加密后,只能由公钥解密出,这是一个利用 hash 的加密过程,不可逆。
ssh 公钥是需要生成的:
ssh-keygen
这段命令会在 ~/.ssh 文件夹中生成 id_rsa.pub 和 id_rsa 密钥,即你的 ssh 公钥 和 私钥。
然后就是远程传输:(这个是需要密码登录的)
ssh-copy-id username@host
然后再次输入一次密码。
下次就是免密登录啦。
ssh username@host
有些时候没有成功的原因是一些权限问题,需要在远程主机上,授予权限 chmod 600 authorized_keys, chmod 700 ~/.ssh
还有不行,就是 远程主机配置文件 /etc/ssh/sshd_config 将 :
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
这几个生效就行,(去注释 #)。
记得重启一下
service sshd restart
3. 补充
也许你在搜索 ssh 公钥登录的时候,也会看到这样一串命令:
$ ssh username@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
解释一下,
请求登录到远程主机
ssh username@host
登录主机后的命令,主目录下 .ssh 不存在则创建,同时(&& 后面的)将本地公钥 ~/.ssh/id_rsa.pub 重定向追加到 .ssh/authorized_keys 中。
'mkdir -p .ssh && cat >> .ssh/authorized_keys'< ~/.ssh/id_rsa.pub
以上就是 ssh-copy-id 的原理。也就是公钥远程设置的原理。
另外涉及的一些 公钥私钥,RSA 等原理,会在后面写新的,(毕竟才学了,记录一下,小声嘀咕)