Secure Shell 协议,简称 SSH,是一种加密网络协议,用于客户端和主机之间的安全连接,并支持各种身份验证机制,目前最实用的身份验证机制就是基于密码的身份验证和基于公钥的身份验证两种。今天带来的是,Linux系统如何设置基于 SSH 公私钥的身份验证,以及如何免密连接到主机的教程。
基于ssh的公私钥的数据传输,前提是通信双方需要有对方的公钥,其原理便是非对称加密详情见:百度百科,所以我们要使用一台电脑的终端去控制另外远程主机,关键步骤便是:把主控端的SSH公钥存到被控端的主机上的 /.ssh/authorized_keys文件中,细分就是以下两个步骤:
- 1.在主控端上生成密钥对
- 2.将主控端生成的公钥发送到被控端
一、设置 SSH 无密码登录
1)检查现有的 SSH 密钥对
在生成新的 SSH 密钥对之前,首先检查主机上是否已有 SSH 密钥,主要是为了不覆盖现有密钥。运行以下Is 命令以查看是否存在现有 SSH 密钥:
ls ~/.ssh
可以看到这里的id_rsa就是密钥,这里的id_rsa.pub就是公钥。
如果存在现有密钥对,可以使用这些密钥对并跳过下一步,或备份旧密钥对并生成新密钥对。如果看到 No such file or directory 或 no matches found 意味着没有 SSH 密钥,则可以继续执行下一步并生成新密钥。
2)生成新的 SSH 密钥对。
以下命令将生成一个新的 4096 位 SSH 密钥对,并将电子邮件地址作为注释:
ssh-keygen -t rsa -b 4096 -C Email
按 Enter 接受则默认文件位置和文件名:
Enter file in which to save the key(/home/yourusername/.ssh/id_rsa):
接下来,ssh-keygen 工具将要求键入安全密码,无论是否想要使用密码短语都可以,如果选择使用密码短语,将获得额外的安全保护。在大多数情况下,开发人员和系统管理员使用 SSH 而不使用密码,因为它们对完全自动化的流程很有用。如果不想使用密码短语,请按 Enter:
Enter passphrase(empty for no passphrase):
要确认是否已经生成 SSH 密钥,可以继续查看~/.ssh目录
ls ~/.ssh
3)复制公钥
现在已经生成了 SSH 密钥对,为了能够在没有密码的情况下登录到主机,需要将公钥复制到要管理的主机。将公钥复制到主机的最简单方法是使用名为的命令 ssh-copy-id
。在本地主机终端类型:
ssh-copy-id remote_username@server_ip_address
系统将提示输入 remote_username 的密码:
remote_username@server_ip_address's password:
用户通过身份验证后,公钥将附加到远程用户 authorized_keys
文件,并且将关闭连接。如果由于某种原因, ssh-copy-id 本地主机上没有该实用程序,则可以使用以下命令复制公钥:
cat ~/.ssh/id_rsa.pub | ssh remote_username@server_ip_address "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
4)使用 SSH 密钥登录
完成上述步骤后,就能够登录到远程主机而不会被提示输入密码,测试口令:
ssh remote_username@server_ip_address
如果无法连接,可以关闭被控端的防火墙
二、禁用 SSH 密码验证
要为主机添加额外的安全层,可以禁用 SSH 的密码身份验证。在禁用 SSH 密码身份验证之前,请确保可以在没有密码的情况下登录到服务器,并且登录的用户具有 sudo 权限。
1)使用具有 sudo 权限的用户或 root 用户,通过 SSH 密钥登录到远程主机:
ssh sudo_user@server_ip_address
2)打开 SSH 配置文件 /etc/ssh/sshd_config ,搜索以下指令并按如下方式进行修改:
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
完成后保存文件并重新启动 SSH 服务。
在Ubuntu或Debian 服务器上,运行命令:sudo systemctl restart ssh
在CentOS或Fedora服务器上,运行命令:sudo systemctl restart sshd
到这里,Linux系统SSH免密连接就都设置完毕,之后就是可以通过SSH免密登录操作了。