提高服务器安全-采用密钥公钥登录而非密码登录-详细操作步骤

文章目录

在本地生成密钥

在自己的电脑执行:

复制代码
ssh-keygen -t ed25519

一路回车(也可以设置密码)

会生成:

私钥:~/.ssh/id_ed25519

公钥:~/.ssh/id_ed25519.pub

手动复制公钥

查看你的公钥

在 PowerShell 输入:

复制代码
type $env:USERPROFILE\.ssh\id_ed25519.pub

或者输入:

复制代码
cat ~/.ssh/id_ed25519.pub

或者输入:

bash 复制代码
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub

这三个爱用哪个用哪个。

会输出一行类似:

复制代码
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... 乱七八糟的乱码

复制整行。

登录服务器(用密码)

复制代码
ssh user@服务器IP

在服务器上执行

复制代码
mkdir -p ~/.ssh
nano ~/.ssh/authorized_keys

把刚才复制的内容粘进去,如果发现无法复制,可以尝试点击第一个空行,然后再复制,注意,是第一个空行,而非整个空白区域。

保存:

复制代码
Ctrl + O → 回车
Ctrl + X

设置权限:

bash 复制代码
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

测试登录

退出服务器:

bash 复制代码
exit

再登录:

bash 复制代码
ssh user@服务器IP

如果不用密码直接进 = 成功,如果你设置了密钥的密码,就会提示你输入passphrase。

关闭密码登录

编辑 SSH 配置:

bash 复制代码
nano /etc/ssh/sshd_config

找到并修改这两行:

搜索,按:

bash 复制代码
Ctrl + W

输入:

bash 复制代码
PasswordAuthentication

如果你看到:

bash 复制代码
#PasswordAuthentication yes

改成(去掉 #):

bash 复制代码
PasswordAuthentication no

这个表示禁止密码登录。

再搜索 root 登录

按:

bash 复制代码
Ctrl + W

输入:

bash 复制代码
PermitRootLogin

如果看到:

bash 复制代码
#PermitRootLogin prohibit-password

改成:

bash 复制代码
PermitRootLogin prohibit-password
(如果没有这一行,就自己加一行)

这个表示root 只能用密钥登录,不能用密码。

保存并退出

按:

bash 复制代码
Ctrl + O   (保存)

回车

bash 复制代码
Ctrl + X   (退出)

重启 SSH 服务

执行:

bash 复制代码
systemctl restart ssh

如果你是CentOS/RHEL之类的,执行:

bash 复制代码
systemctl restart sshd

检查配置是否生效

执行:

bash 复制代码
sshd -T | grep passwordauthentication

如果输出:

bash 复制代码
passwordauthentication yes

说明密码登录还在开启。

如果前面怎么改都不行的话,主配置可能被覆盖了,真正生效的配置,可能在 /etc/ssh/sshd_config.d/ 目录里。

查看这个目录

执行:

bash 复制代码
ls /etc/ssh/sshd_config.d/

查看里面的内容

bash 复制代码
cat /etc/ssh/sshd_config.d/*.conf

如果看到了:

bash 复制代码
PasswordAuthentication yes

那就对胃了。

直接改这个文件:

bash 复制代码
nano /etc/ssh/sshd_config.d/50-cloud-init.conf

把里面的:

bash 复制代码
PasswordAuthentication yes

改成:

bash 复制代码
PasswordAuthentication no

重启 SSH

bash 复制代码
systemctl restart ssh

再验证

bash 复制代码
sshd -T | grep passwordauthentication

这次应该是:

bash 复制代码
passwordauthentication no

一般这种情况是Ubuntu,特别是云服务器,常见。使用 cloud-init 自动生成配置,放在/etc/ssh/sshd_config.d/优先级比主文件还高,配置被"隐藏配置文件"覆盖了

验证一下

不要马上断开当前连接,先开一个新窗口测试:

bash 复制代码
ssh root@你的服务器IP

如果能正常登上去,就可以断开链接了

相关推荐
AuTumn-L5 分钟前
使用 SSH 密钥认证实现安全免密登录
服务器·安全·ssh
领创工作室15 分钟前
GitHub Workflows 全面解析:从核心概念到开源实现
运维·github
吕海洋1 小时前
目前可用的docker源2026.08
运维·docker·容器
知无不研1 小时前
Linux I/O复用之epoll
linux·服务器·epoll·socket编程
rcms152702692182 小时前
TEL 3880-200230-V1 通讯接口模块
安全
dogstarhuang2 小时前
OpenAI GPT-5.6 降价后如何重算 API 账单?多模型路由与成本治理实战
服务器·网络·人工智能·大模型·api·ai应用开发·接口管理
~|Bernard|2 小时前
Linux 定时任务(Cron)完整教程
linux·运维·服务器
小周学学学2 小时前
vmware-horizon第一章:horizon服务器安装
运维·服务器·vmware
gsls2008083 小时前
Penpot Docker 部署与 MCP 服务配置文档
运维·docker·容器·原型·penpot
九硕智慧建筑一体化厂家3 小时前
直流智能照明|全场景节能升级!打造安全低碳的智慧建筑光环境
运维·笔记·安全·智慧城市