1. SSH密钥认证原理
- Client将自己的公钥存放在Server上,追加在文件authorized_keys中。
- Server端接收到Client的连接请求后,会在authorized_keys中匹配到Client的公钥pubKey,并生成随机数R,用Client的公钥对该随机数进行加密得到pubKey(R),然后将加密后信息发送给Client。
- Client端通过私钥进行解密得到随机数R,然后对随机数R和本次会话的SessionKey利用MD5生成摘要Digest1,发送给Server端。
- Server端会也会对R和SessionKey利用同样摘要算法生成Digest2。
- Server端会最后比较Digest1和Digest2是否相同,完成认证过程。
2. 密钥认证的优点
相较于用户名和密码认证方式,SSH密钥对有以下优势:
-
安全性
SSH密钥对登录认证更为安全可靠。
密钥对安全强度远高于常规用户口令,可以杜绝暴力破解威胁。
不可能通过公钥推导出私钥。 -
便捷性
如果您将公钥配置在Linux实例中,那么,在本地或者另外一台实例中,您可以使用私钥通过SSH命令或相关工具登录目标实例,而不需要输入密码。
便于远程登录大量Linux实例,方便管理。如果您需要批量维护多台Linux实例,推荐使用这种方式登录。
3. 服务器通过客户端公钥认证
比如在一个客户端上管理多个服务器,则是将客户端上生成公钥并将其存放在被管理服务上,实现免密认证,具体操作如下:
3.1. 生成密钥对(windows 或 linux 均可)
ssh-keygen
之后一路回车,默认不设密码,默认目录为 ~/.ssh
3.2. 拷贝公钥至服务端(Linux),并赋权限
在服务端允许客户端登录的用户家目录下执行以下操作:
cat id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
特别注意:authorized_keys文件的权限,以及 .ssh 目录的权限不要弄错,否则无法通过认证。
- 将 id_rsa.pub 替换为你的公钥路径即可,如果是在本地生成需上传至服务器端。
- 这项操作可以部署多个公钥,命令会在 authorized_keys 后面追加,而 Linux 公钥验证检测 authorized_keys 文件中的公钥。
- 一个公钥只运行一个用户使用登录。
3.3. 检查服务端密钥登陆功能是否开启
-
打开 SSH 配置文件
sudo vim /etc/ssh/sshd_config
-
查看确认下面两项配置
RSAAuthentication yes PubkeyAuthentication yes
-
当你完成全部设置,并以密钥方式登录成功后,再禁用密码登录(可选)
PasswordAuthentication no
-
重启 SSH
sudo service sshd restart
3.4. 检查本地私钥部署
如果客户端为 windows,您的私钥应存在于 C:\Users\your name\.ssh
目录下,如果是Linux,您的私钥应存放于 /home/your name/.ssh
目录下(root用户为 /root/.ssh
)。
-
登录服务器时默认可不指定私钥,如:
ssh remote-username@remote-ip 或 ssh -l remote-username -p port remote-ip 或 ssh -p port remote-username@remote-ip
-
登录服务器时指定自己私钥的位置,如:
ssh -i /directoryPath/id_rsa(本地私钥文件) remote-username@remote-ip
3.5. windows 使用工具登录
类似于xshell工具,需要读取本地的私钥文件。