0%

远程登录

SSH 密钥认证:安全便捷的远程登录方式

SSH(Secure Shell)是 Linux 系统中远程登录的标准协议,除了传统的密码认证外,密钥认证机制提供了更安全、更便捷的登录方式,无需每次输入密码即可建立连接。本文将详细介绍 SSH 密钥认证的原理和配置方法。

密钥认证的工作原理

SSH 密钥认证基于非对称加密算法(如 RSA 或 ECDSA),通过一对密钥(公钥和私钥)实现身份验证:

  1. 密钥对生成:用户在本地生成一对密钥 —— 公钥(public key)和私钥(private key)。
  2. 公钥部署:将公钥上传到目标服务器的指定位置(~/.ssh/authorized_keys)。
  3. 认证过程:
    • 客户端发起 SSH 连接请求。
    • 服务器生成随机数,用客户端的公钥加密后发送给客户端。
    • 客户端用私钥解密随机数,返回给服务器。
    • 服务器验证结果,一致则允许登录。

优势

  • 安全性更高:私钥仅存于本地,无需在网络中传输密码。
  • 便捷性:配置后无需重复输入密码,适合脚本自动化操作。

密钥认证的配置步骤

1. 在本地客户端生成密钥对

使用 ssh-keygen 命令生成密钥对(默认采用 RSA 算法):

1
ssh-keygen -t rsa -b 4096
  • -t rsa:指定加密算法为 RSA(可选 ecdsaed25519 等)。
  • -b 4096:指定密钥长度为 4096 位(安全性更高,默认 2048 位)。

交互过程

1
2
3
4
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa): # 按回车使用默认路径
Enter passphrase (empty for no passphrase): # 可选:设置密钥保护密码(增强安全性)
Enter same passphrase again: # 重复密码

生成后,在 ~/.ssh/ 目录下会生成两个文件:

  • id_rsa:私钥(重要!妥善保管,不可泄露)。
  • id_rsa.pub:公钥(可公开,用于部署到服务器)。

2. 将公钥上传到目标服务器

方法 1:使用 ssh-copy-id 自动部署(推荐)
1
ssh-copy-id username@remote_host
  • username:目标服务器的用户名。
  • remote_host:服务器 IP 或域名。

该命令会自动将本地公钥(id_rsa.pub)添加到服务器的 ~/.ssh/authorized_keys 文件中,并创建必要的目录和权限。

方法 2:手动上传公钥

若服务器不支持 ssh-copy-id,可手动操作:

  1. 复制本地公钥内容:

    1
    cat ~/.ssh/id_rsa.pub
  2. 登录服务器,创建 .ssh 目录(若不存在):

    1
    2
    3
    ssh username@remote_host  # 用密码登录
    mkdir -p ~/.ssh
    chmod 700 ~/.ssh # 确保目录权限正确(仅所有者可读写)
  3. 将公钥内容追加到 authorized_keys

    1
    2
    nano ~/.ssh/authorized_keys  # 粘贴公钥内容,保存退出
    chmod 600 ~/.ssh/authorized_keys # 确保文件权限正确
  4. 退出服务器:

    1
    exit

3. 测试密钥登录

配置完成后,尝试登录服务器,无需输入密码即可连接:

1
ssh username@remote_host

若生成密钥时设置了 passphrase(密钥密码),首次登录会提示输入该密码(后续可通过 ssh-agent 缓存密码,避免重复输入)。

高级配置:增强安全性与便捷性

禁用密码登录(推荐)

为进一步提升安全性,可在服务器上禁用密码认证,仅允许密钥登录:

  1. 登录服务器,编辑 SSH 配置文件:

    1
    sudo nano /etc/ssh/sshd_config
  2. 修改以下配置:

    1
    2
    PasswordAuthentication no  # 禁用密码认证
    PubkeyAuthentication yes # 启用公钥认证(默认已开启)
  3. 重启 SSH 服务使配置生效:

    1
    2
    3
    4
    5
    # Ubuntu/Debian
    sudo systemctl restart sshd

    # CentOS/RHEL
    sudo systemctl restart sshd

使用 config 文件简化登录

创建本地 ~/.ssh/config 文件,定义服务器别名和登录参数:

1
nano ~/.ssh/config

添加内容(示例):

1
2
3
4
5
6
7
8
Host webserver
HostName 192.168.1.100
User admin
IdentityFile ~/.ssh/id_rsa_web # 若使用专用密钥对

Host dbserver
HostName db.example.com
User root

保存后,可直接通过别名登录:

1
ssh webserver  # 等价于 ssh admin@192.168.1.100

管理多个密钥对

若需要连接多个服务器,可生成专用密钥对并指定使用:

1
2
3
4
5
# 生成专用密钥对
ssh-keygen -t ed25519 -f ~/.ssh/id_rsa_work

# 用指定密钥登录
ssh -i ~/.ssh/id_rsa_work user@workserver

常见问题解决

  1. 密钥登录失败
    • 检查服务器 ~/.ssh/authorized_keys 是否包含本地公钥。
    • 确保服务器 ~/.ssh 目录权限为 700authorized_keys 权限为 600
    • 查看服务器日志排查原因:sudo tail -f /var/log/auth.log(Ubuntu)或 /var/log/secure(CentOS)。
  2. 忘记密钥密码
    • 无法找回,需重新生成密钥对并重新部署公钥。

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10