如何通过公钥认证连接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_keysgitlab_rsa.pub完全一致。
3. 修正连接命令参数
- 使用绝对路径指定私钥(避免相对路径错误),简化命令测试:
先跳过sftp -vvv -i /home/ubuntu/test_key/gitlab_rsa -P 2222 foo@localhostStrictHostKeyChecking等参数,测试正常后再按需添加。
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
相关产品推荐
相关产品推荐

