下面以 OpenSSH(Linux 自带 SFTP 服务) 为例,详细说明 如何使用密钥认证登录 SFTP,并顺带说明安全配置和常见问题。
sftp 或 WinSCP / FileZilla)通常在 客户端机器 上生成密钥
ssh-keygen -t rsa -b 4096 -C "sftp-key"
执行过程中:
~/.ssh/id_rsa(默认)生成后:
~/.ssh/id_rsa # 私钥(客户端保留)
~/.ssh/id_rsa.pub # 公钥(传给服务器)
ssh-copy-id(最简单)ssh-copy-id user@server_ip
会自动把公钥写入:
~/.ssh/authorized_keys
cat ~/.ssh/id_rsa.pub
authorized_keys:mkdir -p ~/.ssh
chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys
# 粘贴公钥内容
chmod 600 ~/.ssh/authorized_keys
⚠️ 权限错误是密钥登录失败最常见原因
编辑 SSH 配置文件:
sudo nano /etc/ssh/sshd_config
确保包含以下配置:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
(可选,但常见)
PasswordAuthentication no # 禁用密码登录(推荐)
PermitRootLogin no # 禁止 root 登录(安全)
重启 SSH 服务:
sudo systemctl restart sshd
# 或
sudo service ssh restart
sftp -i ~/.ssh/id_rsa user@server_ip
如果私钥不是默认路径:
sftp -i /path/to/private_key user@server_ip
.ppk)
检查:
ls -ld ~/.ssh
ls -l ~/.ssh/authorized_keys
正确权限:
.ssh → 700
authorized_keys → 600
restorecon -Rv ~/.ssh
sudo tail -f /var/log/secure
# 或
sudo journalctl -u sshd -f
如果你希望 用户只能 SFTP,不能 SSH 登录:
Subsystem sftp internal-sftp
Match User sftpuser
ChrootDirectory /home/sftpuser
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
⚠️ ChrootDirectory 必须:
root生成密钥 → 上传公钥 → 配置 sshd → 重启 ssh → 使用 sftp -i 登录
如果你愿意,可以告诉我:
我可以给你 完全定制化的配置示例。