Menu Close

SSH 使用公私钥实现认证

1. SSH密钥认证原理

file

  • 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是否相同,完成认证过程。

2. 密钥认证的优点

相较于用户名和密码认证方式,SSH密钥对有以下优势:

  • 安全性
    SSH密钥对登录认证更为安全可靠。
    密钥对安全强度远高于常规用户口令,可以杜绝暴力破解威胁。
    不可能通过公钥推导出私钥。

  • 便捷性
    如果您将公钥配置在Linux实例中,那么,在本地或者另外一台实例中,您可以使用私钥通过SSH命令或相关工具登录目标实例,而不需要输入密码。
    便于远程登录大量Linux实例,方便管理。如果您需要批量维护多台Linux实例,推荐使用这种方式登录。

3. 服务器通过客户端公钥认证

比如在一个客户端上管理多个服务器,则是将客户端上生成公钥并将其存放在被管理服务上,实现免密认证,具体操作如下:

3.1. 生成密钥对(windows 或 linux 均可)

ssh-keygen

之后一路回车,默认不设密码,默认目录为 ~/.ssh

file

3.2. 拷贝公钥至服务端(Linux),并赋权限

在服务端允许客户端登录的用户家目录下执行以下操作:

cat id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh

特别注意:authorized_keys文件的权限,以及 .ssh 目录的权限不要弄错,否则无法通过认证。

  • 将 id_rsa.pub 替换为你的公钥路径即可,如果是在本地生成需上传至服务器端。
  • 这项操作可以部署多个公钥,命令会在 authorized_keys 后面追加,而 Linux 公钥验证检测 authorized_keys 文件中的公钥。
  • 一个公钥只运行一个用户使用登录。

3.3. 检查服务端密钥登陆功能是否开启

  1. 打开 SSH 配置文件

    sudo vim /etc/ssh/sshd_config
  2. 查看确认下面两项配置

    RSAAuthentication yes
    PubkeyAuthentication yes
  3. 当你完成全部设置,并以密钥方式登录成功后,再禁用密码登录(可选)

    PasswordAuthentication no
  4. 重启 SSH

    sudo service sshd restart

3.4. 检查本地私钥部署

如果客户端为 windows,您的私钥应存在于 C:\Users\your name\.ssh 目录下,如果是Linux,您的私钥应存放于 /home/your name/.ssh 目录下(root用户为 /root/.ssh)。

  • 登录服务器时默认可不指定私钥,如:

    ssh remote-username@remote-ip
    或
    ssh -l remote-username -p port remote-ip
    或
    ssh -p port remote-username@remote-ip
  • 登录服务器时指定自己私钥的位置,如:

    ssh -i /directoryPath/id_rsa(本地私钥文件) remote-username@remote-ip

file

3.5. windows 使用工具登录

类似于xshell工具,需要读取本地的私钥文件。