SSH密钥登录完整流程与原理详解

文章目录

  • 一、简要概述
  • 二、核心原理
  • 三、详细操作步骤
    • [1. 生成SSH密钥对](#1. 生成SSH密钥对)
    • [2. 上传公钥到远程服务器](#2. 上传公钥到远程服务器)
    • [3. 测试客户端免密登录](#3. 测试客户端免密登录)
    • [4. 服务器配置强制密钥登录](#4. 服务器配置强制密钥登录)
    • [5, 私钥密码短语](#5, 私钥密码短语)

一、简要概述

SSH密钥登录通过公钥-私钥非对称加密实现免密码安全登录,相比传统密码登录,能有效抵御暴力破解攻击。

此成果可以应用到下面2篇文章,实现ssh免密码输入数据转移

一条Shell命令实现文件目录服务器间快速转移

一条Shell命令实现docker镜像服务器间快速转移

二、核心原理

SSH密钥登录依赖一对密钥:

  • 私钥:保存在客户端(本地电脑/服务器),必须严格保密,用于身份验证的"密码"。
  • 公钥:上传到远程服务器,用于验证客户端身份的"公开凭证"。

登录时,服务器向客户端发送随机数,客户端用私钥加密后返回,服务器用公钥解密验证,匹配则允许登录,全程无需输入密码

三、详细操作步骤

1. 生成SSH密钥对

在本地客户端生成密钥对,推荐使用Ed25519算法(比RSA更高效安全)或RSA 4096

bash 复制代码
# 生成密钥对(默认RSA算法,可指定-b 4096)
ssh-keygen -t ed25519

#生成RSA 4096位密钥
ssh-keygen -t rsa -b 4096
  • 系统会提示保存路径(默认~/.ssh/id_ed25519或~/.ssh/id_rsa),可直接回车确认
  • 强烈建议设置密码短语(passphrase):为私钥增加一层保护,即使私钥泄露,无密码也无法使用

2. 上传公钥到远程服务器

  • 方式1: ssh-copy-id
bash 复制代码
ssh-copy-id root@目标服务器IP

# 默认端口(22)
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@目标服务器IP

# 非默认端口(如1022)
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 1022 root@目标服务器IP

若公钥在默认~/.ssh/目录下,可省略-i参数。

上传后,目标服务器~/.ssh/authorized_keys文件会添加一行公钥内容。

  • 方法2:手动复制公钥

在客户端服务器执行脚本

bash 复制代码
#导入Ed25519公钥
cat ~/.ssh/id_ed25519.pub | ssh 用户名@服务器IP \
'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys \
&& chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys'

#导入RSA公钥
cat ~/.ssh/id_rsa.pub | ssh 用户名@服务器IP \
'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys \
&& chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys'

检查目录权限,不符合的话执行配置权限脚本(关键步骤,权限错误会导致免密失败)

本地客户端

bash 复制代码
chmod 700 ~/.ssh          # .ssh目录权限:仅所有者可读写执行
chmod 600 ~/.ssh/id_ed25519  # 私钥权限:仅所有者可读写

远程服务器

bash 复制代码
# .ssh目录权限:仅所有者可读写执行
chmod 700 ~/.ssh
# 授权文件权限:仅所有者可读写
chmod 600 ~/.ssh/authorized_keys

3. 测试客户端免密登录

bash 复制代码
#默认端口22
ssh root@目标服务器IP

#非默认端口1022
ssh -p 1022 root@目标服务器IP

4. 服务器配置强制密钥登录

bash 复制代码
#删除配置项
sed -i '/PasswordAuthentication.*/d' /etc/ssh/sshd_config
sed -i '/PubkeyAuthentication.*/d' /etc/ssh/sshd_config
sed -i '/RSAAuthentication.*/d' /etc/ssh/sshd_config
sed -i '/AuthorizedKeysFile.*/d' /etc/ssh/sshd_config

#追加配置项
cat >>/etc/ssh/sshd_config<<EOF
PasswordAuthentication no
PubkeyAuthentication yes
RSAAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

EOF

重启服务启用配置

bash 复制代码
#重启sshd服务
systemctl restart sshd

5, 私钥密码短语

给私钥设置了密码短语,又不想每次都输入,可以使用ssh-agent缓存密码,输入1次保存1天。

ssh-agent是 Linux/Unix 系统中用于管理 SSH 私钥的代理工具,核心作用是在内存中缓存私钥,实现 SSH 免密码登录,同时避免私钥文件直接暴露在远程服务器,提升安全性。

启动一个临时的 ssh-agent 进程,并导出必要的环境变量(SSH_AUTH_SOCK 和 SSH_AGENT_PID),让当前 shell 会话能识别该代理。

bash 复制代码
eval "$(ssh-agent -s)"

添加私钥到 ssh-agent

bash 复制代码
# 首次添加需输入私钥的密码短语
ssh-add ~/.ssh/id_rsa

ssh-add ~/.ssh/id_ed25519  

朋友们,你学会了吗?

--over--

相关推荐
Mr小林1 小时前
Docker 安装教程(在线 + 离线)
运维·docker·容器
JudithHuang2 小时前
把本地服务暴露到公网
运维
yt004yt3 小时前
### 越华环保集团|绿岛 VOCs 集中治理,管网系统安全设计工程实战分享
大数据·运维
yt004yt3 小时前
越华环保集团|绿岛 VOCs 集中治理,管网系统安全设计工程实战分享
大数据·运维
晚安日记wanna3 小时前
压测 TPS 卡在 800CPU 只跑四成六步定位法
运维·面试·测试
吴声子夜歌5 小时前
Shell编程实例——bash入门
linux·运维·shell
爱和冰阔落5 小时前
【Linux】条件变量为什么必须配合互斥锁:从 pthread_cond_wait 到阻塞队列
linux·运维·c++·缓存·中间件·安卓
ynchyong5 小时前
Linux nohup 后台服务合并标准错误输出到一个文件
java·linux·运维
牛油果子哥q5 小时前
LLM 服务网关设计:流量分发、鉴权、限流、多模型路由、负载均衡、接口版本管理(C++ 网关落地)
运维·负载均衡
傲世仙尊5 小时前
从磁盘硬件到Ext文件系统-Linux磁盘级文件系统学习笔记
linux·运维·服务器·开发语言·c++