SSH原理以及实现远程免密登录
SSH简介
SSH(Secure Shell)是一种网络协议,用于计算机之间的加密登录。SSH只是一种协议,存在多种实现,既有商业实现,也有开源实现。本文针对的实现是 OpenSSH,它是自由软件,应用非常广泛。
口令登录
输入命令:
ssh user@host -p port
如果你是第一次登录对方主机,系统会出现下面的提示:
The authenticity of host 'host (xx.xxx.xx.xx)' 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)?
输入yes
后会出现如下提示:
Warning: Permanently added 'host,xx.xx.xxx.xx' (RSA) to the list of known hosts.
然后,会要求输入密码。
Password: (enter password)
如果密码正确,就可以登录了。
当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts
之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。
公钥登录
使用密码登录,每次都必须输入密码,非常不方便。SSH
还提供了公钥登录,可以省去输入密码的步骤。原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell
,不再要求密码。
口令与公钥登录原理
-
密码口令登录
通过密码进行登录,主要流程为:
- 客户端连接上服务器之后,服务器把自己的公钥传给客户端
- 客户端输入服务器密码通过公钥加密之后传给服务器
- 服务器根据自己的私钥解密登录密码,如果正确那么就让客户端登录
-
公钥登录
公钥登录是为了解决每次登录服务器都要输入密码的问题,流行使用RSA加密方案,主要流程包含:
- 客户端生成RSA公钥和私钥
- 客户端将自己的公钥存放到服务器
- 客户端请求连接服务器,服务器将一个随机字符串发送给客户端
- 客户端根据自己的私钥加密这个随机字符串之后再发送给服务器
- 服务器接受到加密后的字符串之后用公钥解密,如果正确就让客户端登录,否则拒绝。这样就不用使用密码了。
免密登录配置
使用ssh-keygen
生成秘钥:
ssh-keygen -t rsa -C "注释"
# -t 指定秘钥类型
# -C 注释
# -f 指定秘钥文件和存储文件名
运行结束以后,在$HOME/.ssh/
目录下,会新生成两个文件:id_rsa.pub
和id_rsa
。前者是你的公钥,后者是你的私钥。
输入下面的命令,将公钥传送到远程主机host
上面:
ssh-copy-id user@host -p port
然后,编辑/etc/ssh/sshd_config
这个文件,检查下面几行前面"#"注释是否取掉。
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
重启SSH
服务:
service sshd restart
ssh-copy-id
命令
ssh-copy-id
命令可以把本地主机的公钥复制到远程主机的authorized_keys
文件上,ssh-copy-id
命令也会给远程主机的用户主目录(home)和~/.ssh
, 和~/.ssh/authorized_keys
设置合适的权限。
-
语法
ssh-copy-id [-i [identity_file]] [user@]machine
-
选项
-i
:指定公钥文件
实例:
1、把本地的ssh公钥文件安装到远程主机对应的账户下:
ssh-copy-id user@server
ssh-copy-id -i ~/.ssh/id_rsa.pub user@server
authorized_keys
文件
authorized_keys
的权限要是600!!!如果不是,可能会无法免密登录,可以使用下面的命令进行设置:
chmod 600 /root/.ssh/authorized_keys
除了使用ssh-copy-id
命令,还可以使用下面命令来把本地的公钥写入远程主机的authorized_keys
:
ssh user@host -p port 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub