在 Linux 上启用 SFTP 密钥认证,核心思路是:
用 SSH 密钥代替密码登录,SFTP 底层走的是 SSH,所以只要 SSH 支持密钥登录,SFTP 自然就支持。
下面按 最常见、最安全 的方式一步步说明(以 OpenSSH 为例)。
sudo systemctl status sshd
编辑配置:
sudo vi /etc/ssh/sshd_config
确保以下配置存在且未被注释:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
⚠️ 如果改了配置,需要重启 SSH:
sudo systemctl restart sshd
ssh-keygen -t ed25519 -C "sftp-user"
或(兼容旧系统):
ssh-keygen -t rsa -b 4096
一路回车即可,会生成:
~/.ssh/id_ed25519~/.ssh/id_ed25519.pub⚠️ 私钥不要泄露
ssh-copy-id user@server_ip
cat ~/.ssh/id_ed25519.pub
mkdir -p ~/.ssh
chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
ssh user@server_ip
✅ 不再提示输入密码
sftp user@server_ip
确认密钥登录成功后,再执行:
sudo vi /etc/ssh/sshd_config
修改:
PasswordAuthentication no
重启 SSH:
sudo systemctl restart sshd
Permission denied (publickey)
检查:
ls -ld ~
ls -ld ~/.ssh
ls -l ~/.ssh/authorized_keys
正确权限示例:
drwx------ user user ~
drwx------ user user .ssh
-rw------- user user authorized_keys
restorecon -Rv ~/.ssh
Subsystem sftp internal-sftp
Match User sftpuser
ChrootDirectory /data/sftp
ForceCommand internal-sftp
PasswordAuthentication no
⚠️ ChrootDirectory 必须由 root 拥有,且权限 ≤ 755
✅ 生成密钥
✅ 上传公钥到服务器
✅ 设置正确权限
✅ 启用 PubkeyAuthentication
✅ 禁用密码登录
如果你愿意,可以告诉我:
我可以给你一份 可直接用的完整配置模板。