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--

相关推荐
枳实-叶2 小时前
Linux 环境下段错误出现的原因及调试方法
linux·运维·服务器
Chief_fly2 小时前
ARM 麒麟系统服务器构建docker镜像
运维·服务器·docker
Dawn-bit2 小时前
Linux文本处理三剑客之sed详解
linux·运维·服务器·云计算·运维开发
dok123 小时前
Johannes 《Linux内核模块与设备驱动开发:编写Linux驱动程序》 (9)manual_cdev
linux·运维·驱动开发
czhaii3 小时前
汇川注塑机伺服驱动器故障维修排除方法
运维·服务器
Cx330❀3 小时前
【Linux网络】深入 HTTP 协议(五):从 Cookie/Session 原理到 C++ 源码实战
linux·运维·服务器·开发语言·网络·c++·http
keyipatience3 小时前
Socket编程3个版本
linux·运维·服务器·开发语言·网络·ubuntu
Dobby_053 小时前
【CICD】Jenkins Pipeline 快速学习入门
运维·学习·jenkins
nxb55612 小时前
haproxy算法,ip透传,自定义haproxy错误页面
运维·服务器