为了节省大家的时间,先直接跟大家分享我所遇到的问题以及我的解决方法。
我的目的很简单,就是能让我通过自定义的用户名bingo以及密钥对里的密码来git clone下我的git项目,这个项目我在自己个人服务器47.100.3.39上创建的。
使用git clone下载我的项目时,总提示让我输入bingo@47.100.3.39的密码,但输入密钥对的密码,根本没用,一直提示permission denied
有2个解决方法:
1. 如果我只是想把git项目clone下来,我可以在自己服务器上创建bingo用户并设置密码,然后用这个密码就ok了
useradd bingo passwd bingo
2. 如果我不想在服务器上为bingo用户单独设置ssh密码,而是使用本地创建密钥对时的密码来clone项目
step1:同样在服务器里,先创建bingo用户
useradd bingo
step2:这个时候在/home目录下就会有个bingo的文件夹,创建.ssh文件夹以及authorized_keys文件
cd /home/bingo mkdir .ssh cd .ssh touch authorized_keys chmod 777 authorized_keys cd /home chown -R bingo:bingo bingo
step3:本地生成密钥对,然后把公钥copy到上面authorized_keys文件里
ssh-keygen -t rsa
我把公钥一直copy到/root/.ssh/authorized_keys文件里,所以密钥对就一直未奏效,因为服务器压根就没找到公钥(因为我粘贴的位置不对)
在解决了这个问题的过程中,也学习到了ssh配置方面的更多内容,接下来继续和大家分享。
git clone的底层实质就是通过ssh协议来实现的,所以测试ssh连接没问题,git clone也基本就没问题了。
网上查了好久试了好久,无果,没办法只能硬着头皮看命令执行的详细信息了
ssh -T -v bingo@47.100.3.39
可以看出4个小点的信息:
1. 先检查本地.ssh/config文件
我本地config文件内容如下:
#project1 Host gitlab.test1.com IdentityFile ~/.ssh/id_rsa User aaa@test1.com #project2 Host www.test2.com IdentityFile ~/.ssh/id_rsa_test2 User bbb@test2.com #project3 Host 47.100.3.39 UserKnownHostsFile ~/.ssh/known_hosts PubkeyAcceptedKeyTypes=+ssh-rsa PasswordAuthentication no ChallengeResponseAuthentication no IdentityFile ~/.ssh/memo User bingo@47.100.3.39
2. 根据host,它会从config锁定到相对应的配置,从而找到私钥文件.ssh/memo
3. 会检查客户端和服务端Openssh的版本号,这里是一致的。本人猜测,不一致或许可能会有影响。
4. .ssh目录下找到know_hosts2文件
因为这一步信息,我错误的认为就是这个导致的,所以上面config文件我额外添加了一行
UserKnownHostsFile ~/.ssh/known_hosts
下图是后面的日志信息
从日志里可以看出,命令是有去查找known_hosts文件的。
其次,验证会有4种类型,中间2种我也不清楚,但重点是:
当公钥publickey方式验证不通过时,就会采用password验证的方式
这里password,指的就是在服务端创建的账号密码,即前面这一步你设置的密码:
passwd bingo
如果在上面config文件里,将PasswordAuthentication设置为no,输入ssh账号的密码途径就没有了。我已经实践认证过了,大家有兴趣可以自己实践。
本文为翟码农个人博客Linux分类下的原创文章,创作不易,转载还请注明出处:http://www.zhai14.com/blog/why-git-clone-always-permission-denied-after-pubkey-copied-to-git-server.html
rsa密钥对密码(可以看到私钥文件名memo的路径):
ssh账号密码(有显示用户名,下图里用户名是git)
1. .ssh/config文件里的User配置,在本篇git clone项目里没啥用。
2. 修改authorized_keys文件,要改中间部分的内容,改末尾的没用。(本人胡乱修改,是用来验证publickey这一步是否会失败的)
3. 很多资料都是把git仓库建在/home/git目录下,但其实目录是可以任意的,只需要保证用户名有权限即可(本文里是bingo)
4. 还有一行ChallengeResponseAuthentication的配置,这个是加强信息安全的。关于原理,等我搞懂了,继续和大家分享。