SSH证书登录配置完整指南
本文档详细说明了如何配置Linux云服务器仅允许SSH证书登录,禁止密码登录,以提高服务器安全性。
目录
-
- 前置条件
-
- 第一步:生成SSH密钥对
-
- 第二步:将公钥添加到云服务器
-
- 第三步:修改SSH配置禁用密码登录
-
- 第四步:重启SSH服务并测试
-
- 后续使用方法
-
- 常用管理命令
-
- 故障排除
前置条件
客户端(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:无法使用证书登录
可能原因:
-
• 私钥文件路径错误
-
• 私钥文件权限不正确
-
• 公钥未正确添加到服务器
解决方法:
-
- 检查私钥文件路径:
go
Test-Path "C:\Users\YourUsername\.ssh\id_rsa_server"
-
- 检查私钥文件权限(Linux):
go
chmod 600 ~/.ssh/id_rsa_server
-
- 重新添加公钥:
go
cat ~/.ssh/authorized_keys
问题2:密码登录仍然可用
可能原因:
-
• SSH配置未正确修改
-
• SSH服务未重启
解决方法:
-
- 检查SSH配置:
go
grep PasswordAuthentication /etc/ssh/sshd_config
-
- 确保配置为
no:
- 确保配置为
go
PasswordAuthentication no
-
- 重启SSH服务:
go
systemctl restart sshd
问题3:配置后无法登录服务器
紧急恢复方法:
如果您在配置后无法登录服务器,可以通过以下方式恢复:
方法一:使用云服务商控制台
-
- 登录云服务商控制台(阿里云、腾讯云等)
-
- 找到服务器的"VNC连接"或"远程连接"功能
-
- 通过控制台登录服务器
-
- 恢复SSH配置:
go
cp /etc/ssh/sshd_config.bak /etc/ssh/sshd_config
systemctl restart sshd
方法二:使用救援模式
-
- 通过云服务商进入救援模式
-
- 挂载服务器磁盘
-
- 修改SSH配置文件
-
- 重启服务器
问题4:SSH连接超时
可能原因:
-
• 防火墙阻止SSH连接
-
• SSH服务未运行
-
• 网络问题
解决方法:
-
- 检查SSH服务状态:
go
systemctl status sshd
-
- 检查防火墙:
go
# CentOS/RHEL
firewall-cmd --list-all
# Ubuntu/Debian
ufw status
-
- 检查端口监听:
go
netstat -tlnp | grep 22
问题5:私钥文件损坏
解决方法:
-
- 检查私钥文件格式:
go
Get-Content "C:\Users\YourUsername\.ssh\id_rsa_server" | Select-Object -First 3
预期输出:
go
-----BEGIN OPENSSH PRIVATE KEY-----
或
-----BEGIN RSA PRIVATE KEY-----
-
- 如果格式不正确,重新生成密钥对
安全建议
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