介绍
SSH 是一种协议,通常用于通过命令行从一台计算机访问另一台计算机。使用 SSH,您可以在远程计算机和服务器上运行命令、发送文件,通常还可以从一个位置管理您所做的一切。
在Linux系统中,免密码登录是一种便捷的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是否相同,完成认证过程。
配置
生成密钥对
1
2
# 生成密钥对,默认存储在~/.ssh/id_rsa和~/.ssh/id_rsa.pub中。你也可以使用-f参数指定文件路径。
ssh-keygen -t rsa
将公钥添加到远程服务器
1
2
3
4
5
6
7
# 使用ssh-copy-id命令,它会将你的公钥添加到远程服务器的authorized_keys文件中。
ssh-copy-id user@remote_server
# 或者
# 上传公钥到远程服务器,然后执行
cat id_rsa.pub > .ssh/authorized_keys
这时候就可以通过本地机器的私钥id_rsa
,免密码登录远程服务器了。
1
2
# 登录远程服务器,无需输入密码。
ssh user@remote_server
管理多个id_rsa文件
为了解决客户端使用不同私钥登录多个服务器的问题,可以在本地机器的~/.ssh/config
文件中,可以设置如下内容以实现管理多个私钥免密码登录:
1
2
3
4
5
6
7
8
9
10
11
12
13
Host remote_server
Hostname your_remote_host
Port 22
User your_username
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_1 # 指定私钥文件路径
Host ali mmy83.online 192.168.1.55
HostName 192.168.1.55
Port 22
User root
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_2 # 指定私钥文件路径
Host:自定义别名,方便记忆。例如:remote_server、ali等,可以多个,用空格分隔即可。
HostName:真实的服务器地址(域名)
User:之前配置的用户名可以省略,默认为当前用户
PreferredAuthentications:权限认证(publickey,password publickey,keyboard-interactive)一般直接设为 publickey
IdentityFile:rsa文件地址,默认为
~/.ssh/id_rsa
注意:
通常情况下,我们只需要一个私钥文件即可,把公钥分发到你想免密登录的服务器上。但如果需要管理多个服务器或使用不同的密钥对进行登录(比如:别人给你一个私钥),这种方法就显得非常有用。
使用
完成上述步骤后,你就可以直接使用以下命令进行无密码登录了:
1
ssh user@remote_server
注意事项
确保.ssh目录和其子文件的权限设置正确,通常为700(仅拥有者有读、写、执行权限)。
确保你的私钥文件(例如
id_rsa
)的权限设置为600,这样可以防止其他用户读取到你的密钥。同样的,确保服务器的authorized_keys文件的权限也应该设置为600。
如果在登录时遇到问题,检查
.ssh/config
配置是否正确,以及服务器上的~/.ssh/authorized_keys
文件中是否有正确的公钥。对于多人共享的系统或服务器,务必谨慎处理SSH密钥和访问控制策略,以避免安全风险。