Linux 如何生成密钥对进行 ssh 免密登陆

最近由于项目快要上线了,服务器从测试环境转到了生产环境,登陆方式也从原来的密码认证替换成了密钥认证。vim

这么作的目的是为了防止服务器密码被暴力破解。服务器

ssh 是什么?

ssh 是一种协议,它能够基于密码进行认证,也能够基于密钥去认证用户。ssh

生成密钥对

这里咱们使用 RSA 类型的加密类型来建立密钥对。测试

ssh-keygen -f ~/.ssh/your_key_name
  1. -f 参数表示指定密钥对生成位置与名称
  2. 密钥对一般放在 $HOME/.ssh 目录下
  3. 回车便可建立密钥对,若是不须要为密钥对进行加密,那么能够一路回车。

建立成功以后,能够看到 .ssh 目录下多了两个文件,分别是:加密

  • your_key:密钥对的私钥,一般放在客户端。
  • your_key.pub:密钥对中的公钥,一般放在服务端。

将本地的公钥传到服务器上

注意:这里是将your_key.pub 公钥文件上传至你须要链接的服务器,而不是your_key私钥文件。spa

ssh-copy-id -i ~/.ssh/your_key.pub user@<ip address> -pport

-i 参数表示使用指定的密钥,-p参数表示指定端口,ssh 的默认端口是 22,若是没有更改默认端口,则能够省略。rest

这里须要输入一次密码进行确认,若是成功以后,会看到如下内容:code

本地的公钥文件上传在服务器的哪里?

在该用户的.ssh/authorized_keys 文件中。blog

cat ~/.ssh/authorized_keys

经过密钥对进行免密登陆

如今咱们可使用如下命令登陆到服务器中了:ip

ssh -p port -i ~/.ssh/your_key user@<ip address>

不出意外,就能够不用输入密码而直接成功登陆了。

若是你仍然须要输入密码或者遇到其余问题了,能够从如下方向进行排查。

常见问题:

  1. 若是没有使用默认的密钥名称(id_rsa),则在链接主机时须要加上-i 参数,指定对应密钥的名称。不然因为默认私钥与远程主机中的自定义公钥不匹配,天然没法基于密钥进行认证,会再次提示你输入密码。
  2. 服务端的$HOME/.ssh目录的正常权限是700,服务端$HOME/.ssh/authorized_keys文件的权限默认为600。
  3. 上传密钥时使用的是:公钥(.pub),进行密钥认证时使用的是:私钥。

配置ssh config

上面的命令虽然能够实现免密登陆,可是命令太长了,就算是复制粘贴也有可能会出错。

那有没有什么好的办法,解决这个问题呢?

固然是有的啦。

$HOME/.ssh 目录下,建立一个名为config的文件。

vim $HOME/.ssh/conifg

加入如下配置:

Host alias
    User user
    HostName ip address
    Port port
    IdentityFile ~/.ssh/your_key
    ServerAliveInterval 360

参数说明:

  • Host:能够理解成别名,配置完成以后,最后就经过 ssh alias 进行登陆。
  • User:远程主机的用户名称
  • HostName:远程主机的地址
  • Port:端口号
  • IdentityFile:私钥文件的路径
  • ServerAliveInterval:保持客户端与服务端会话在短期内不会断开。

固然,若是你是使用ssh 客户端,那就不用配置这些。

禁用经过密码认证

若是上面的配置都无误,能够正常经过密钥进行免密登陆,那么最后须要作的一件事情就是关闭服务端的经过密码进行身份认证。

vim /etc/ssh/sshd_config

# 将yes 改成 no
PasswordAuthentication yes

而后重启 sshd 服务。

service sshd restart

以上就是有关如何用自定义的密钥对进行免密认证的所有过程了。