You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过公钥认证连接Docker容器内的atmoz/sftp

解决atmoz/sftp容器公钥认证失败问题

问题现象

  • 执行SFTP连接命令后,客户端日志提示load pubkey "./test_key/gitlab_rsa": invalid format,公钥认证失败
  • 容器内已确认authorized_keys包含对应公钥,且该私钥在Ubuntu主机上可正常使用
  • 开启sshd详细日志后,显示Failed publickey for foo错误

解决步骤

1. 检查私钥文件格式与权限

  • 确认私钥gitlab_rsa为OpenSSH格式:执行cat ./test_key/gitlab_rsa,内容开头应为-----BEGIN RSA PRIVATE KEY-----,结尾为-----END RSA PRIVATE KEY-----。若为其他格式(如PuTTY),用ssh-keygen -p -f ./test_key/gitlab_rsa转换为OpenSSH格式。
  • 修正私钥权限:sshd对私钥权限要求严格,必须设置为600,执行:
    chmod 600 ./test_key/gitlab_rsa
    

2. 验证容器公钥加载逻辑

  • 检查主机上的gitlab_rsa.pub格式:内容开头应为ssh-rsa AAAAB3NzaC1yc2E...,无多余换行或注释。
  • 重启容器确保公钥正确加载:
    docker restart sftp
    
  • 进入容器确认authorized_keys内容:
    docker exec -it sftp cat /home/foo/.ssh/authorized_keys
    
    需确保内容与主机上的gitlab_rsa.pub完全一致。

3. 修正连接命令参数

  • 使用绝对路径指定私钥(避免相对路径错误),简化命令测试:
    sftp -vvv -i /home/ubuntu/test_key/gitlab_rsa -P 2222 foo@localhost
    
    先跳过StrictHostKeyChecking等参数,测试正常后再按需添加。

4. 检查容器内用户目录权限

  • 进入容器查看权限:
    docker exec -it sftp bash
    ls -ld /home/foo /home/foo/.ssh /home/foo/.ssh/authorized_keys
    
  • 权限需符合以下要求,不符合则执行对应命令修正:
    • /home/foo:权限为755(不能是777),执行chmod 755 /home/foo
    • /home/foo/.ssh:权限必须为700,执行chmod 700 /home/foo/.ssh
    • /home/foo/.ssh/authorized_keys:权限必须为600,执行chmod 600 /home/foo/.ssh/authorized_keys

5. 修正主机密钥挂载权限

  • 确保挂载的容器主机密钥权限正确,在主机上执行:
    chmod 600 /home/ubuntu/test_key/ssh_host_ed25519_key /home/ubuntu/test_key/ssh_host_rsa_key
    
  • 重启容器使权限生效:docker restart sftp

内容的提问来源于stack exchange,提问作者dur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 22:36:20