xChar
·2 months ago

一、为什么使用公私钥登录

  1. 安全性更高
  • 密码复杂性问题:密码登录通常需要用户记住复杂的密码,但很多人为了方便会选择简单密码,这容易被暴力破解。而公私钥登录使用的是非对称加密技术,私钥的长度通常较长(如4096位),破解难度极大。(公网中暴露22端口的ssh服务每天都会收到大量爆破密码的登录请求,我查看日志每天都有上千次)
  • 防止中间人攻击:公私钥认证机制在加密过程中可以有效防止中间人攻击。即使攻击者截获了通信内容,也无法获取私钥或解密数据。
  • 无密码泄露风险:在公私钥登录过程中,私钥始终保存在本地,不会像密码登录那样通过网络传输,因此不存在密码在传输过程中被截获的风险。
  1. 登录更便捷
  • 无需手动输入密码:一旦配置好公私钥登录,用户无需手动输入密码即可快速登录服务器,大大提高了工作效率,尤其适合频繁登录服务器的场景。
  • 支持多台服务器:可以将同一个公钥添加到多台服务器上,使用同一对密钥登录多台服务器,简化了登录过程。(但同时如果私钥文件丢失或泄露,也会发生连锁反应)
  • 自动化操作:公私钥登录支持无密码登录,便于实现自动化脚本操作(使用python fabric库自动部署),例如通过 SSH 执行远程命令、文件传输等
  1. 可扩展性强
  • 易于管理:公钥可以方便地分发给多台服务器,而私钥只需在本地妥善保管。如果需要更换密钥,只需重新生成密钥对并将新的公钥上传到服务器即可。

二、生成密钥对

要想使用公私钥登录服务器首先需要生成密钥对,可以在本地计算机使用 ssh-keygen 命令生成密钥对。

  1. ssh-keygen命令需要安装OpenSSH客户端

以Windows11为例,在设置>系统>可选功能 搜索OpenSSH 安装客户端, 使用powershell查看是否安装

> gcm ssh-keygen

CommandType     Name                 Version    Source
-----------     ----                 -------    ------
Application     ssh-keygen.exe       9.5.3.1    C:\Windows\System32\OpenSSH\ssh-keygen.exe
  1. 生成密钥对命令,
ssh-keygen -t rsa -b 4096
  • -t rsa:指定密钥类型为 RSA。
  • -b 4096:指定密钥长度为 4096 位,更高的密钥长度意味着更强的安全性

回车后会提示你输入保存密钥的文件路径和可选的密码,不需要密码直接按回车跳过即可。

默认情况,密钥会保存在 ~/.ssh/id_rsa(私钥)和 ~/.ssh/id_rsa.pub(公钥),在Windows上一般在C:\Users\<用户名>\.ssh
例如在我这里

24123@lolik ~\.ssh
> ls
    目录: C:\Users\24123\.ssh
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         2025/2/19     10:03            210 config
-a----          2024/6/7     14:43           3381 id_rsa
-a----          2024/6/7     14:43            738 id_rsa.pub
-a----         2025/2/19      9:57           5828 known_hosts
-a----         2025/2/19      9:52           5080 known_hosts.old

known_hosts 可能保存着连接过的服务器公钥,我的config是vs code 保存的远程连接信息创建的,包含别名和主机名等

  1. 简化连接操作

在上述config文件中(没有可以自己创建)例如:

# Read more about SSH config files: https://linux.die.net/man/5/ssh_config
  Host winserverA
    HostName 1.1.1.1
    User administrator
    IdentityFile ~/.ssh/id_rsa

  Host serverB
    HostName 1.1.1.1
    User root
    IdentityFile ~/.ssh/id_rsa
  • Host:为服务器设置一个别名,方便记忆。

  • HostName:服务器的 IP 地址。

  • User:服务器的用户名。

  • IdentityFile:私钥文件路径。

    IdentityFile 似乎默认是 ~/.ssh/id_rsa

    因为我使用ssh 别名ssh username@ip 命令可以直接登录,没有指定-i ~/.ssh/id_rsa

三、将公钥上传到服务器

  1. 将公钥内容复制到剪贴板
cat ~/.ssh/id_rsa.pub

​ 选择输出内容复制

  1. 登录服务器,使用密码或者其他方式

    在服务器上,家目录~下创建 .ssh 目录(如果不存在),并修改权限

    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
    

    使用vi 或者vim 创建~/.ssh/authorized_keys

    vim  ~/.ssh/authorized_keys
    

    粘贴公钥并保存

  2. 修改服务器ssh配置

    编辑/etc/ssh/sshd_config文件

    vim /etc/ssh/sshd_config
    
    • PubkeyAuthentication yes
    • AuthorizedKeysFile .ssh/authorized_keys

​ 允许公钥验证和指定公钥文件

  • PermitRootLogin 设置为 prohibit-passwordwithout-password,禁用 root 用户的密码登录,仅允许公钥登录。
  1. 重启sshd服务使配置生效(也可使用老命令service

    sudo systemctl sshd restart
    
  2. 登录测试

    例如 在本地计算机终端输入,server_ip是服务器ip(如果根据上面在config配置了别名,也可使用别名登录)

    ssh root@server_ip          
    

    本地如果是首次登录会显示警告,输入yes即可

    不出意外会直接登录服务器,也是相当便捷

Loading comments...