临近年底,病毒肆虐,为防暴力破解,把服务器改为证书登录

SSH证书登录配置完整指南

本文档详细说明了如何配置Linux云服务器仅允许SSH证书登录,禁止密码登录,以提高服务器安全性。


目录

    1. 前置条件
    1. 第一步:生成SSH密钥对
    1. 第二步:将公钥添加到云服务器
    1. 第三步:修改SSH配置禁用密码登录
    1. 第四步:重启SSH服务并测试
    1. 后续使用方法
    1. 常用管理命令
    1. 故障排除

前置条件

客户端(Windows)

  • • 已安装OpenSSH客户端(Windows 10/11默认已安装)

  • • 有PowerShell访问权限

  • • 有服务器root权限或sudo权限

服务端(Linux)

  • • 已安装OpenSSH服务器

  • • 有root权限或sudo权限

  • • 当前可以通过密码登录


第一步:生成SSH密钥对

方法一:使用ssh-keygen生成新密钥(推荐)

在Windows PowerShell中执行:

go 复制代码
# 生成4096位RSA密钥对
ssh-keygen -t rsa -b 4096 -f "$env:USERPROFILE\.ssh\id_rsa_server" -C "admin@server"

参数说明:

  • -t rsa:使用RSA算法

  • -b 4096:密钥长度为4096位(更安全)

  • -f:指定密钥文件路径

  • -C:添加注释(通常是邮箱)

执行后会提示:

go 复制代码
Enter passphrase (empty for no passphrase):

建议:

  • • 可以设置密码短语(passphrase)以提高安全性

  • • 如果不需要,直接按Enter跳过

方法二:使用现有密钥

如果您已经有SSH密钥,可以跳过此步骤,直接使用现有密钥。

生成的文件

生成后会创建两个文件:

  • 私钥C:\Users\YourUsername\.ssh\id_rsa_server

  • 公钥C:\Users\YourUsername\.ssh\id_rsa_server.pub

⚠️ 重要提示:

  • • 私钥文件必须妥善保管,不要泄露

  • • 公钥文件可以公开,需要添加到服务器


第二步:将公钥添加到云服务器

方法一:使用ssh-copy-id(推荐,Linux客户端)

go 复制代码
ssh-copy-id -i ~/.ssh/id_rsa_server.pub root@服务器IP

方法二:手动添加(Windows客户端)

2.1 查看公钥内容
go 复制代码
Get-Content "$env:USERPROFILE\.ssh\id_rsa_server.pub"
2.2 登录到服务器
go 复制代码
$env:Path += ";$env:SystemRoot\System32\OpenSSH"
ssh root@服务器IP
2.3 创建.ssh目录(如果不存在)
go 复制代码
mkdir -p ~/.ssh
chmod 700 ~/.ssh
2.4 添加公钥到authorized_keys
go 复制代码
echo "您的公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
2.5 验证公钥已添加
go 复制代码
cat ~/.ssh/authorized_keys

方法三:使用PowerShell命令(推荐)

go 复制代码
# 一次性完成公钥添加
$env:Path += ";$env:SystemRoot\System32\OpenSSH"
$publicKey = Get-Content "$env:USERPROFILE\.ssh\id_rsa_server.pub"
ssh root@服务器IP "mkdir -p ~/.ssh && chmod 700 ~/.ssh && echo '$publicKey' >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

测试证书登录

go 复制代码
ssh -i "$env:USERPROFILE\.ssh\id_rsa_server" root@服务器IP

如果可以成功登录,说明公钥配置正确!


第三步:修改SSH配置禁用密码登录

3.1 备份SSH配置文件

go 复制代码
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

3.2 修改SSH配置文件

方法一:使用sed命令(推荐)
go 复制代码
# 禁用密码登录
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config
sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config

# 启用公钥认证
echo 'PubkeyAuthentication yes' >> /etc/ssh/sshd_config
方法二:使用vim编辑器
go 复制代码
vim /etc/ssh/sshd_config

找到并修改以下配置项:

go 复制代码
# 禁用密码登录
PasswordAuthentication no

# 启用公钥认证
PubkeyAuthentication yes

# 确保以下配置(可选,提高安全性)
PermitRootLogin prohibit-password

保存并退出:

  • • 按 Esc

  • • 输入 :wq

  • • 按 Enter

3.3 验证配置

go 复制代码
grep -E '(PasswordAuthentication|PubkeyAuthentication)' /etc/ssh/sshd_config

预期输出:

go 复制代码
PasswordAuthentication no
PubkeyAuthentication yes

第四步:重启SSH服务并测试

4.1 重启SSH服务

go 复制代码
systemctl restart sshd

4.2 检查SSH服务状态

go 复制代码
systemctl status sshd

预期输出:

go 复制代码
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since ...

4.3 测试证书登录

保持当前SSH连接不要断开!(防止配置错误导致无法登录)

打开新的终端窗口,测试证书登录:

go 复制代码
ssh -i "$env:USERPROFILE\.ssh\id_rsa_server" root@服务器IP

如果可以成功登录,说明配置正确!

4.4 测试密码登录(应该失败)

go 复制代码
ssh -o StrictHostKeyChecking=no -o PreferredAuthentications=password root@服务器IP "echo '测试'"

预期结果:

go 复制代码
Permission denied (publickey,gssapi-keyex,gssapi-with-mic)

如果看到这个错误,说明密码登录已成功禁用!


后续使用方法

方法一:直接使用私钥文件

go 复制代码
$env:Path += ";$env:SystemRoot\System32\OpenSSH"
ssh -i "C:\Users\YourUsername\.ssh\id_rsa_server" -o StrictHostKeyChecking=no root@服务器IP

方法二:配置SSH配置文件(推荐)

2.1 创建SSH配置文件

在Windows上创建或编辑 C:\Users\YourUsername\.ssh\config 文件:

go 复制代码
Host server-alias
    HostName 服务器IP
    User root
    Port 22
    IdentityFile C:\Users\YourUsername\.ssh\id_rsa_server
    StrictHostKeyChecking no

参数说明:

  • Host:服务器别名(自定义)

  • HostName:服务器IP地址

  • User:登录用户名

  • Port:SSH端口(默认22)

  • IdentityFile:私钥文件路径

  • StrictHostKeyChecking no:跳过主机密钥确认(可选)

2.2 使用别名登录
go 复制代码
ssh server-alias

方法三:在PowerShell中设置别名

编辑PowerShell配置文件 $PROFILE

go 复制代码
notepad $PROFILE

添加以下函数:

go 复制代码
function Connect-CloudServer {
    $env:Path += ";$env:SystemRoot\System32\OpenSSH"
    ssh -i "C:\Users\YourUsername\.ssh\id_rsa_server" -o StrictHostKeyChecking=no root@服务器IP
}

# 设置别名
Set-Alias ccs Connect-CloudServer

使用时只需输入:

go 复制代码
ccs

常用管理命令

查看SSH服务状态

go 复制代码
systemctl status sshd

查看SSH配置

go 复制代码
cat /etc/ssh/sshd_config

查看已授权的公钥

go 复制代码
cat ~/.ssh/authorized_keys

重启SSH服务

go 复制代码
systemctl restart sshd

查看SSH登录日志

go 复制代码
# 查看最近的SSH登录记录
journalctl -u sshd -n 50

# 实时监控SSH登录日志
journalctl -u sshd -f

查看当前登录用户

go 复制代码
who

查看SSH连接数

go 复制代码
netstat -antp | grep sshd | wc -l

故障排除

问题1:无法使用证书登录

可能原因:

  • • 私钥文件路径错误

  • • 私钥文件权限不正确

  • • 公钥未正确添加到服务器

解决方法:

    1. 检查私钥文件路径:
go 复制代码
Test-Path "C:\Users\YourUsername\.ssh\id_rsa_server"
    1. 检查私钥文件权限(Linux):
go 复制代码
chmod 600 ~/.ssh/id_rsa_server
    1. 重新添加公钥:
go 复制代码
cat ~/.ssh/authorized_keys

问题2:密码登录仍然可用

可能原因:

  • • SSH配置未正确修改

  • • SSH服务未重启

解决方法:

    1. 检查SSH配置:
go 复制代码
grep PasswordAuthentication /etc/ssh/sshd_config
    1. 确保配置为 no
go 复制代码
PasswordAuthentication no
    1. 重启SSH服务:
go 复制代码
systemctl restart sshd

问题3:配置后无法登录服务器

紧急恢复方法:

如果您在配置后无法登录服务器,可以通过以下方式恢复:

方法一:使用云服务商控制台
    1. 登录云服务商控制台(阿里云、腾讯云等)
    1. 找到服务器的"VNC连接"或"远程连接"功能
    1. 通过控制台登录服务器
    1. 恢复SSH配置:
go 复制代码
cp /etc/ssh/sshd_config.bak /etc/ssh/sshd_config
systemctl restart sshd
方法二:使用救援模式
    1. 通过云服务商进入救援模式
    1. 挂载服务器磁盘
    1. 修改SSH配置文件
    1. 重启服务器

问题4:SSH连接超时

可能原因:

  • • 防火墙阻止SSH连接

  • • SSH服务未运行

  • • 网络问题

解决方法:

    1. 检查SSH服务状态:
go 复制代码
systemctl status sshd
    1. 检查防火墙:
go 复制代码
# CentOS/RHEL
firewall-cmd --list-all

# Ubuntu/Debian
ufw status
    1. 检查端口监听:
go 复制代码
netstat -tlnp | grep 22

问题5:私钥文件损坏

解决方法:

    1. 检查私钥文件格式:
go 复制代码
Get-Content "C:\Users\YourUsername\.ssh\id_rsa_server" | Select-Object -First 3

预期输出:

go 复制代码
-----BEGIN OPENSSH PRIVATE KEY-----
或
-----BEGIN RSA PRIVATE KEY-----
    1. 如果格式不正确,重新生成密钥对

安全建议

1. 使用强密码短语(Passphrase)

在生成密钥时设置密码短语,即使私钥泄露,攻击者也需要密码才能使用。

2. 定期更换SSH密钥

建议每6-12个月更换一次SSH密钥。

3. 限制SSH访问IP

/etc/hosts.allow/etc/hosts.deny 中配置IP白名单。

4. 使用非标准端口

修改SSH端口,避免暴力破解:

go 复制代码
vim /etc/ssh/sshd_config
# 修改 Port 22 为其他端口,如 Port 2222
systemctl restart sshd

5. 启用fail2ban

安装fail2ban防止暴力破解:

go 复制代码
# CentOS/RHEL
yum install fail2ban

# Ubuntu/Debian
apt install fail2ban

6. 禁用root登录(可选)

创建普通用户,使用sudo提权:

go 复制代码
# 创建普通用户
adduser username
usermod -aG sudo username

# 修改SSH配置
vim /etc/ssh/sshd_config
# 修改 PermitRootLogin yes 为 PermitRootLogin no
systemctl restart sshd

附录

A. SSH配置文件详解

配置项 说明 推荐值
PasswordAuthentication 是否允许密码登录 no
PubkeyAuthentication 是否允许公钥认证 yes
PermitRootLogin 是否允许root登录 prohibit-password
Port SSH监听端口 22(可修改)
PermitEmptyPasswords 是否允许空密码 no
MaxAuthTries 最大认证尝试次数 3

B. SSH密钥类型对比

类型 密钥长度 安全性 兼容性 推荐度
RSA 2048/4096 极好 ⭐⭐⭐⭐⭐
ECDSA 256/384/521 极高 ⭐⭐⭐⭐
Ed25519 256 极高 较好 ⭐⭐⭐⭐⭐

C. 常用SSH命令

go 复制代码
# 端口转发
ssh -L 本地端口:目标地址:目标端口 用户@服务器

# 文件传输
scp -i 私钥文件 本地文件 用户@服务器:/远程路径

# 远程命令执行
ssh 用户@服务器 "命令"

# SSH隧道
ssh -D 本地端口 用户@服务器

总结

通过本文档的配置,您的服务器已经实现了:

✅ 仅允许SSH证书登录

✅ 禁用密码登录

✅ 提高服务器安全性

⚠️ 重要提醒:

  • • 务必妥善保管私钥文件

  • • 定期备份SSH配置

  • • 定期检查SSH登录日志

  • • 如果需要恢复密码登录,使用备份文件


文档版本: 1.0
更新日期: 2026-01-16
适用系统: CentOS 7+, Ubuntu 18+, Debian 9+
客户端系统: Windows 10/11, macOS, Linux

相关推荐
05大叔14 小时前
网络基础知识 域名,JSON格式,AI基础
运维·服务器·网络
安当加密14 小时前
无需改 PAM!轻量级 RADIUS + ASP身份认证系统 实现 Linux 登录双因子认证
linux·运维·服务器
dashizhi201514 小时前
服务器共享禁止保存到本地磁盘、共享文件禁止另存为本地磁盘、移动硬盘等
运维·网络·stm32·安全·电脑
卷福同学15 小时前
【养虾日记】QClaw操作浏览器自动化发文
运维·人工智能·程序人生·自动化
woho77889916 小时前
不同网段IP的网络打印机,打印、扫描设置
运维·服务器·网络
耗子会飞16 小时前
小白学习固定VM虚拟机的centos服务器的IP
运维·服务器·centos
门豪杰17 小时前
Ubuntu下安装Claude Code
linux·运维·ubuntu·claude·claude code
新新学长搞科研17 小时前
第五届电子、集成电路与通信技术国际学术会议(EICCT 2026)
运维·人工智能·自动化·集成测试·信号处理·集成学习·电气自动化
桌面运维家17 小时前
Windows/Linux双启动:BIOS/UEFI多配置桌面创建指南
linux·运维·windows
無法複制17 小时前
debian安装Postgresql-14.x
运维·postgresql·debian