1. 在开始之前,你需要了解一些情况
用 SSH 公钥认证从而连接登陆远程服务器是一个强大的功能,比通过账号密码登录更加安全。SSH 公钥依赖于非对称加密算法,该算法生成一对分开的密钥,即公钥和私钥。你保密私钥,并将它存储在你用来进行远程连接系统的电脑上。因此,你可以分享你的公钥而不泄露私钥;你存储公钥到远程系统的 ~/.ssh/authorized_keys
文件。
为了使用 SSH 公钥认证:
- 远程系统上必须安装同一版本的 SSH。本文的信息是假设远程系统使用的是 OpenSSH 的情况下,如果远程系统使用的是不同的版本(如 Techia SSH),下面的描述可能不准确。
- 你用于远程连接服务的电脑上也必须安装同一版本的 SSH。
- 你需要能把你的公钥传输到远程系统上。
2. 在 Linux 或者 Mac 电脑上设置公钥验证
为了在 Linux 或者 Mac 上设置公钥验证:
- 登陆到你将要用于远程连接的电脑上,然后用 SSH 命令行去通过 RSA 算法生成密钥对。
ssh-keygen -t rsa
- 你将根据提示提供文件名(保存密钥对)和密码(保存你的私钥)
-
文件名:如果不输入任何值,按下回车。则是默认的文件名
另外,你也可以在提示中输入文件名(如,
my_ssh_key
),然后按下回车键。然而一些远程主机都被配置为通过默认的路径和默认文件名去接受私钥(对于 RSA 密钥来说,默认为~/.ssh/id_rsa
)。因此,为了使用有不同的文件名的私钥去通过认证,或者使用没存储在默认路径的私钥去通过认证,你必须明确的调用在 SSH 命令行或者在 SSH 客户端的配置文件(~/.ssh/config
)。这里是详细介绍 -
密码:输入至少五个字节的密码,然后按下
回车键
。如果你什么都没输入,就按下回车,那你的私钥将处于无密码保护状态注意:
UITS 强烈建议使用密码保护你的私钥。如果你没有密码保护你的私钥,可以想象任何一个拥有连接您电脑权限的人,在有对应公钥的情况下,在任意一台远程系统上都能登陆到您的账号。
-
你的私钥将使用默认文件名(如:id_rsa
)或者你指定的文件名(如:my_ssh_key
)生成,然后存储在你电脑主目录下的 .ssh
文件下。(如:~/.ssh/id_rsa
或 ~/.ssh/my_ssh_key
)
相应的公钥也将用相同的文件名生成(但是有额外的 .pub
扩展名),存储在相同目录下(如:~/.ssh/id_rsa.pub
或者 ~/.ssh/my_ssh_key.pub
)
- 使用
SFTP
或者SCP
复制你的公钥文件(如:~/.ssh/id_rsa.pub
)到你的远程系统的账号上。如用scp
命令行
scp ~/.ssh/id_rsa.pub username@host:
- 用你的账号和密码登陆远程系统
如果远程电脑上没有配置支持基于密码的身份认证,你将需要联系系统管理员,添加你的公钥到你账户下的
~/.ssh/authorized_keys
文件(如果你的账户上没有~/.ssh/authorized_keys
文件,管理员可以为你创建一个文件)。一旦你的公钥被加入到远程系统的~/.ssh/authorized_keys
文件中,设置过程就完成了,你可以在有你私钥的电脑上通过SSH
登陆你的远程账
- 如果你远程系统的账户中没有
~/.ssh/authorized_keys
文件,创建一个;在命令行中,输入以下命令:
mkdir -p ~/.ssh
touch ~/.ssh/authorized_keys
注意:
如果远程系统上你的账号已经有
~/.ssh/authorized_keys
文件,执行以上命令,不会对已经存在的文件造成任何损害
- 在远程系统中,添加之前上传的公钥文件(如:
~/id_rsa.pun
)内容到~/.ssh/authorized_keys
文件的新的行;在命令行,输入以下内容:
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
你可能想验证 ~/.ssh/authorized_keys
的内容去确保正确添加了你的公钥;在命令行输入以下内容:
more ~/.ssh/authorized_keys
- 在远程系统的你的账户上,可以安全删除公钥文件(如:
~/id_rsa.pub
)。在命令行输入以下内容:
rm ~/id_rsa.pub
另外,如果你想要在远程系统上保存公钥的备份,把它移动到你的 .ssh
目录中;在命令行执行以下命令:
mv ~/id_rsa.pub ~/.ssh/
可选。重复执行步骤 3-7 去添加你的公钥到其他的你想要通过 SSH 链接的远程系统中。
-
现在,你应该可以在拥有你私钥(如:
~/.ssh/id_rsa.pub
)的电脑上通过 SSH 远程连接到你的账户- 如果你的私钥有了密码保护,那么远程系统将会提示你关于这个密码(你私钥的密码没有传递给远程系统):
$ ssh username@host Enter passphrase for key '/username/Host1/.ssh/id_rsa': Last login: date from otherHost
- 如果你的私钥没有密码保护,远程系统将会把你置于你的主目录的命令行,而不会就密码问题提示你
$ ssh username@host Last login: date from otherHost
如果你现在用的私钥,并不是默认名称或者存放在默认的目录(如:~/.ssh/id_rsa
),你必须用明确的使用下面的两个方法中的一个
1. 在 SSH 命令行:添加 `-i` 标志和你的私钥路径
比如:为了调用你的私钥 `host2_key`,存放在 `~/.ssh/old_keys` 目录,当连接你在远程主机上的账户时,输入:
ssh -i ~/.ssh/old_keys/host2_key username@host
2. 在 SSH 客户端的配置文件中:SSH 会从以下来源中获取配置数据:
1) 来自命令行选项
2) 来自用户客户端的配置文件(~/.ssh/config),如果存在的话
3) 从系统范围的客户端配置文件(/etc/ssh/ssh_config)
SSH 客户端配置文件是一个包含了关键字和参数的 txt 文件。为了指定哪个私钥应该被用来与特定的远程主机进行连接,用文本编辑器创建 ~/.ssh/config
包含了 Host
和 IdentityFile
关键字。
比如,要链接 host2.somewhere.edu
,为了使 SSH 自动调用存储在 ~/.ssh/old_keys
目录的私钥 host2_key
,创建一个包含了以下行的 ~/.ssh/config
文件
Host host2.somewhere.edu
IdentityFile ~/.ssh/old_keys/host2_key
保存文件后,SSH 将用指定的私钥去与这个主机进行连接。
你可以添加多个 Host
和 IdentityFile
去指定不同的私钥对应不同的主机列表,如:
Host host2.somewhere.edu
IdentityFile ~/.ssh/old_keys/host2_key
Host host4.somewhere.edu
IdentityFile ~/.ssh/old_keys/host4_key
Host host6.somewhere.edu
IdentityFile ~/.ssh/old_keys/host6_key
另外,你也可以用单个的 * 号为所有的主机提供一个全局的默认值。(即,一个私钥对应多个主机)
Host *.somewhere.edu
IdentityFile ~/.ssh/old_keys/all_hosts_key
以上内容,均来源于https://kb.iu.edu/d/aews