ssh-使用-RSA-密钥完成免密码登录

大多数 Linux 服务器并不包含完善的用户界面,很多时候也并非安装在本地机器上。而是使用 SSH 远程登录的方式来完成对服务器的控制。
SSH(Secure Shell)提供两种级别的验证方式。第一种是基于口令的验证,即使用自己的用户名和密码登录远程机器。
第二种是基于密钥的验证,即先在本地机器上创建一对密钥(公钥私钥),将公钥上传到远程服务器,登录时通过对比客户端与远程端的密钥来进行验证。
基于密钥的验证是不需要在网络上传输口令的,相对而言更加安全。

Linux 上的 ssh 服务器可以使用 openssh ,使用软件包管理器直接安装即可:
$ sudo apt-get install openssh-server

使用密钥进行远程登录还可以实现自动登录(不需要输入密码),以下为详细配置过程。

一、在本地机器上创建密钥

$ ssh-keygen -t rsa -C 'email@domain.com'
-t 选项用来指定密钥类型,默认即为 rsa);-C 选项用来提供说明文字
命令执行成功后会在 ~/.ssh 目录下分别创建公钥(默认为 id_rsa.pub)和私钥(默认为 id_rsa)文件
ssh 创建密钥

二、将公钥上传至服务器

这一步需要将本地生成的公钥文件(id_rsa.pub)内容添加到服务器上的 ~/.ssh/authorized_keys 文件中。

可使用 scp 命令完成远程复制:

1
2
3
4
$ scp ~/.ssh/id_rsa.pub username@hostname:~/    # 将公钥文件上传至服务器用户主目录
$ ssh username@hostname # 使用用户名和密码登录至服务器
$ mkdir .ssh # 在远程服务器上创建 .ssh 目录
$ cat id_rsa.pub >> ~/.ssh/authorized_keys # 将公钥文件内容追加到authorized_keys文件末尾

scp 上传公钥

上面我使用的是 virtualbox 虚拟机安装的 ubuntu 16.04 Server,利用 NAT 的端口转发将宿主机的 8022 端口映射到了虚拟机的 22 端口。-P 8022 用于指定端口号

修改 authorized_keys 文件
以上步骤完成后就可以通过 ssh username@hostname 命令直接登录远程主机。

登录成功界面

三、配置登录别名

可以通过在本地机器上的 ~/.ssh/config 文件中定义别名,然后使用 ssh <alias> 命令即可直接登录远程服务器。
该文件格式如下:

1
2
3
4
5
Host        alias    # 自定义别名
HostName hostname # 服务器地址
Port port # 远程 ssh 服务的端口号,默认为22
User user # 用户名
IdentityFile ~/.ssh/id_rsa # 本地公钥文件位置

配置登录别名
登录效果:使用别名登录

针对第二步中上传密钥的操作,还可以使用此命令:
$ cat ~/.ssh/id_rsa.pub | ssh username@hostname "mkdir ~/.ssh; cat >> ~/.ssh/authorized_keys"
ssh 上传密钥

附:配置 github 账号时也需要用到生成密钥的操作,可以参考上面的 ssh-keygen 命令