外观
通过SSH私钥访问Linux服务器
SSH(Secure Shell)是访问远程Linux服务器最常用的方式。相比密码登录,使用SSH私钥认证更加安全和便捷。本文将详细介绍如何通过私钥文件访问Linux服务器。
什么是SSH私钥认证?
SSH私钥认证是一种基于密钥对的认证方式:
- 私钥(Private Key):保存在本地客户端,需要严格保密
- 公钥(Public Key):部署在远程服务器上,可以公开
只有拥有对应私钥的客户端才能访问配置了对应公钥的服务器账户。
优势
✅ 更安全:比密码认证更难以破解
✅ 更便捷:配置后无需每次输入密码
✅ 自动化友好:适合脚本和自动化任务
步骤一:生成SSH密钥对
如果还没有SSH密钥对,需要先生成:
# 生成SSH密钥对
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# 或者使用更现代的 ed25519 算法
ssh-keygen -t ed25519 -C "your_email@example.com"参数说明:
-t:指定密钥类型(rsa 或 ed25519)-b:指定密钥长度(rsa 需要指定,ed25519 不需要)-C:添加注释(通常是邮箱地址)
执行后会提示:
- 选择密钥保存位置(默认:
~/.ssh/id_rsa或~/.ssh/id_ed25519) - 设置密钥密码(可选,但推荐设置)
生成完成后,会得到两个文件:
- 私钥:
~/.ssh/id_rsa(或id_ed25519) - 公钥:
~/.ssh/id_rsa.pub(或id_ed25519.pub)
步骤二:将公钥部署到服务器
方法1:使用 ssh-copy-id(推荐)
ssh-copy-id -i ~/.ssh/id_rsa.pub username@server_ip
# 或者指定端口
ssh-copy-id -i ~/.ssh/id_rsa.pub -p 2222 username@server_ip方法2:手动复制公钥
# 1. 查看公钥内容
cat ~/.ssh/id_rsa.pub
# 2. 登录服务器(首次使用密码)
ssh username@server_ip
# 3. 在服务器上创建 .ssh 目录(如果不存在)
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# 4. 将公钥追加到 authorized_keys
echo "你的公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys步骤三:使用私钥连接服务器
使用默认私钥
如果私钥保存在默认位置(~/.ssh/id_rsa 或 ~/.ssh/id_ed25519),直接使用:
ssh username@server_ip
# 指定端口
ssh -p 2222 username@server_ip使用指定的私钥文件
如果私钥文件在其他位置或使用自定义名称:
ssh -i /path/to/private_key username@server_ip
# 指定端口和私钥
ssh -i /path/to/private_key -p 2222 username@server_ip示例
# 使用位于当前目录的私钥
ssh -i ./my_server_key.pem ubuntu@192.168.1.100
# 使用位于 ~/keys 目录的私钥
ssh -i ~/keys/server_key ubuntu@192.168.1.100使用 .pem 格式的私钥文件
.pem 文件是常见的私钥文件格式(常见于AWS、阿里云等云服务商),使用方式与普通私钥文件完全相同:
# 基本用法
ssh -i /path/to/your-key.pem username@server_ip
# 指定端口
ssh -i /path/to/your-key.pem -p 2222 username@server_ip
# 完整示例
ssh -i ~/Downloads/my-server.pem ubuntu@47.76.90.129⚠️ 使用 .pem 文件时的常见问题:
1. 权限问题(最常见)
SSH要求私钥文件权限必须严格设置为 600(仅所有者可读写),否则会拒绝连接并显示错误:
Permissions 0644 for 'key.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.解决方法:
# 修改文件权限为 600(仅所有者可读写)
chmod 600 /path/to/your-key.pem
# 如果文件在下载目录,可以先移动到安全位置
mv ~/Downloads/server.pem ~/.ssh/
chmod 600 ~/.ssh/server.pem
# 然后使用
ssh -i ~/.ssh/server.pem username@server_ip2. 文件路径问题
确保使用绝对路径或正确的相对路径:
# 使用绝对路径(推荐)
ssh -i /Users/yourname/path/to/key.pem user@server
# 使用相对路径(从当前目录)
ssh -i ./key.pem user@server
# 使用波浪号路径
ssh -i ~/keys/server.pem user@server3. 私钥格式问题
某些云服务商提供的 .pem 文件可能是PKCS#8格式,需要转换为OpenSSH格式:
检查文件格式:
# 查看文件开头
head -1 /path/to/key.pem
# 标准OpenSSH格式应该以以下之一开头:
# -----BEGIN RSA PRIVATE KEY-----
# -----BEGIN PRIVATE KEY-----
# -----BEGIN EC PRIVATE KEY-----
# -----BEGIN OPENSSH PRIVATE KEY-----如果格式不对,可以转换:
# PKCS#8 转 OpenSSH
openssl pkcs8 -in original.pem -out converted.pem -nocrypt
# 或者使用 ssh-keygen 转换
ssh-keygen -p -m PEM -f /path/to/key.pem4. 验证私钥是否有效
# 检查私钥文件是否可以读取
ssh-keygen -y -f /path/to/key.pem
# 如果能正常输出公钥内容,说明私钥文件有效
# 如果报错,说明文件格式有问题或已损坏5. 使用详细模式查看错误信息
如果连接失败,使用 -v(详细模式)查看详细错误:
# 详细模式(1级)
ssh -v -i /path/to/key.pem username@server_ip
# 更详细(2级)
ssh -vv -i /path/to/key.pem username@server_ip
# 最详细(3级)
ssh -vvv -i /path/to/key.pem username@server_ip这可以帮助你定位具体是哪个步骤出了问题。
首次连接时的主机指纹验证
当你第一次连接到服务器时,SSH会显示类似以下的提示:
The authenticity of host '****' can't be established.
ED25519 key fingerprint is SHA256:0MhjtdesbDD1K5Ox+jAqBE1R+/Fi2Txw1KR+sTcKXPg.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?这个提示的含义
这是SSH的安全机制,用于防止中间人攻击(MITM Attack):
- 无法确认主机身份:SSH无法验证这是你要连接的真实服务器
- 显示主机指纹:服务器提供了一个唯一标识(fingerprint),让你验证服务器的真实性
- 询问是否继续:需要你确认是否信任这个服务器
如何处理
✅ 如果你确定这是你要连接的服务器:
# 输入 yes 并按回车
yes输入 yes 后,SSH会将服务器的指纹保存到 ~/.ssh/known_hosts 文件中。之后再次连接时就不会再显示这个提示了。
⚠️ 如何验证服务器指纹是否真实?
如果是你自己管理的服务器,可以通过以下方式获取服务器指纹进行对比:
在服务器上执行:
# 查看服务器的SSH主机密钥指纹(ED25519)
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
# 查看RSA指纹
ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub或者查看所有可用的指纹:
# 查看所有SSH主机密钥指纹
for key in /etc/ssh/ssh_host_*_key.pub; do
ssh-keygen -lf "$key"
done如果指纹匹配,说明这是真实的服务器,可以安全地输入 yes。
如果指纹不匹配,可能是:
- 服务器重新安装了系统
- IP地址被重新分配给了其他服务器
- 可能存在中间人攻击(此时应拒绝连接)
常见的指纹格式
SSH主机密钥的指纹可能有不同的格式:
- ED25519:
SHA256:0MhjtdesbDD1K5Ox+jAqBE1R+/Fi2Txw1KR+sTcKXPg - RSA:
SHA256:AbCdEf...或MD5:12:34:56:78:90:ab:cd:ef
如果输入错误怎么办?
如果误输入了 no,或者指纹验证失败,可以:
- 重新连接:再次执行SSH连接命令
- 手动验证指纹:通过其他安全渠道(如服务器控制台)获取并验证指纹
- 清除旧的指纹:如果服务器IP变更或系统重装,需要清除旧指纹
# 从 known_hosts 中删除特定主机的指纹
ssh-keygen -R 47.76.90.129
# 或者手动编辑 known_hosts 文件
nano ~/.ssh/known_hosts自动化场景(跳过确认)
在脚本或自动化场景中,如果确定服务器是安全的,可以跳过交互式确认:
# 方法1:使用 StrictHostKeyChecking=no(不推荐用于生产环境)
ssh -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa user@server
# 方法2:预先添加到 known_hosts(推荐)
ssh-keyscan -H server_ip >> ~/.ssh/known_hosts
ssh -i ~/.ssh/id_rsa user@server⚠️ 注意:StrictHostKeyChecking=no 会跳过主机验证,存在安全风险,仅建议在测试环境使用。
步骤四:配置 SSH Config(可选但推荐)
创建或编辑 ~/.ssh/config 文件,可以为常用服务器设置别名和参数:
# 编辑 SSH 配置文件
nano ~/.ssh/config配置示例:
Host myserver
HostName 192.168.1.100
User ubuntu
Port 22
IdentityFile ~/.ssh/id_rsa
IdentitiesOnly yes
Host production
HostName example.com
User deploy
Port 2222
IdentityFile ~/keys/production_key
IdentitiesOnly yes配置后使用:
# 直接使用别名连接
ssh myserver
ssh production配置参数说明:
Host:服务器别名HostName:服务器IP或域名User:用户名Port:SSH端口(默认22)IdentityFile:私钥文件路径IdentitiesOnly yes:只使用指定的私钥,不尝试其他密钥
常见问题解决
1. 权限问题(.pem 文件最常见)
这是使用 .pem 文件时最常见的问题!
SSH要求私钥文件权限必须严格设置为 600(仅所有者可读写),否则会报错:
Permissions 0644 for 'key.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.解决方法:
# 修改 .pem 文件权限为 600
chmod 600 /path/to/your-key.pem
# 对于普通私钥文件
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 700 ~/.ssh
# 在 macOS/Linux 上,确保父目录权限正确
chmod 700 ~/.ssh如果文件在下载目录或其他位置:
# 建议移动到 ~/.ssh/ 目录并设置正确权限
mv ~/Downloads/server.pem ~/.ssh/server.pem
chmod 600 ~/.ssh/server.pem
# 然后使用
ssh -i ~/.ssh/server.pem username@server_ip2. 连接被拒绝
检查以下几点:
# 检查SSH服务是否运行
sudo systemctl status ssh
# 检查防火墙设置
sudo ufw status
# 检查SSH配置文件
sudo nano /etc/ssh/sshd_config3. 仍然要求输入密码
检查服务器上的配置:
# 确保 authorized_keys 权限正确
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
# 检查 SSH 配置是否允许公钥认证
# /etc/ssh/sshd_config 中应该有:
# PubkeyAuthentication yes
# AuthorizedKeysFile .ssh/authorized_keys4. 使用多个私钥
如果需要在同一台机器上使用多个不同的私钥:
# 方法1:使用 -i 参数指定
ssh -i ~/.ssh/key1 username1@server1
ssh -i ~/.ssh/key2 username2@server2
# 方法2:使用 SSH Config(推荐)
# 在 ~/.ssh/config 中为不同服务器配置不同私钥5. 添加私钥到 SSH Agent(避免重复输入密码)
# 启动 SSH Agent
eval "$(ssh-agent -s)"
# 添加私钥(如果私钥设置了密码)
ssh-add ~/.ssh/id_rsa
# 添加 .pem 文件
ssh-add /path/to/key.pem
# 查看已添加的密钥
ssh-add -l6. .pem 文件连接问题排查步骤
如果你使用 .pem 文件连接失败,按以下步骤排查:
步骤1:检查文件权限
# 检查当前权限
ls -l /path/to/key.pem
# 应该显示类似:-rw------- 1 user staff xxxx Jan 27 key.pem
# 如果不是 -rw-------,需要修改权限
chmod 600 /path/to/key.pem步骤2:验证私钥文件格式
# 检查文件开头
head -1 /path/to/key.pem
# 应该以以下之一开头:
# -----BEGIN RSA PRIVATE KEY-----
# -----BEGIN PRIVATE KEY-----
# -----BEGIN EC PRIVATE KEY-----
# -----BEGIN OPENSSH PRIVATE KEY-----
# 尝试提取公钥验证私钥是否有效
ssh-keygen -y -f /path/to/key.pem步骤3:使用详细模式查看错误
# 使用 -vvv 查看详细连接过程
ssh -vvv -i /path/to/key.pem username@server_ip步骤4:检查服务器端配置
确保服务器允许公钥认证:
# 在服务器上检查(如果可以其他方式登录)
sudo grep -E "PubkeyAuthentication|AuthorizedKeysFile" /etc/ssh/sshd_config步骤5:确认用户名和IP正确
# 检查用户名是否正确(不同系统默认用户不同)
# Ubuntu/Debian: ubuntu
# CentOS/RHEL: root 或 centos
# Amazon Linux: ec2-user
# 完整连接命令示例
ssh -i ~/.ssh/server.pem ubuntu@47.76.90.129安全建议
🔒 私钥安全
- 永远不要分享私钥文件
- 私钥文件权限设置为 600
- 为私钥设置密码保护
- 定期更换密钥对
🔒 服务器安全
- 禁用密码认证,只允许密钥认证(修改
/etc/ssh/sshd_config) - 修改默认SSH端口(22)
- 使用防火墙限制SSH访问IP
- 定期更新SSH服务
🔒 配置建议
在服务器上编辑 /etc/ssh/sshd_config:
PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin no修改后重启SSH服务:
sudo systemctl restart sshd实用示例
自动化部署脚本示例
#!/bin/bash
# deploy.sh
SERVER="user@example.com"
KEY="/path/to/deploy_key"
REMOTE_PATH="/var/www/app"
ssh -i $KEY $SERVER << 'ENDSSH'
cd $REMOTE_PATH
git pull
npm install
pm2 restart app
ENDSSHSCP 传输文件示例
# 上传文件
scp -i ~/.ssh/id_rsa local_file.txt user@server:/remote/path/
# 下载文件
scp -i ~/.ssh/id_rsa user@server:/remote/path/remote_file.txt ./
# 递归传输目录
scp -i ~/.ssh/id_rsa -r ./local_dir user@server:/remote/path/RSYNC 同步示例
rsync -avz -e "ssh -i ~/.ssh/id_rsa" ./local_dir/ user@server:/remote/path/总结
通过SSH私钥访问Linux服务器是一个安全、高效的远程管理方式。关键步骤:
- ✅ 生成SSH密钥对
- ✅ 将公钥部署到服务器
- ✅ 使用私钥连接服务器
- ✅ 配置SSH Config简化操作
- ✅ 遵循安全最佳实践
掌握了这些方法,你就可以安全便捷地管理远程服务器了!
相关资源:
贡献者
更新日志
2025/11/21 09:32
查看所有更新日志
d0c9b-docs(blog): 更新三篇技术分享文章的创建时间于93b3a-docs(blog): 添加SSH私钥访问Linux服务器的博客文章于
版权所有
版权归属:ntzw
许可证:CC0 1.0 通用 (CC0)
