文章大纲

明明公钥已经拷贝到git服务器了,为啥git clone还是提示permission denied

2025-03-04 19:36:23

为了节省大家的时间,先直接跟大家分享我所遇到的问题以及我的解决方法。

我的目的

我的目的很简单,就是能让我通过自定义的用户名bingo以及密钥对里的密码来git clone下我的git项目,这个项目我在自己个人服务器47.100.3.39上创建的。


遇到的问题

使用git clone下载我的项目时,总提示让我输入bingo@47.100.3.39的密码,但输入密钥对的密码,根本没用,一直提示permission denied


解决方法

有2个解决方法:

1. 如果我只是想把git项目clone下来,我可以在自己服务器上创建bingo用户并设置密码,然后用这个密码就ok了


bsh
useradd bingo
passwd bingo


2. 如果我不想在服务器上为bingo用户单独设置ssh密码,而是使用本地创建密钥对时的密码来clone项目

step1:同样在服务器里,先创建bingo用户


bsh
useradd bingo



step2:这个时候在/home目录下就会有个bingo的文件夹,创建.ssh文件夹以及authorized_keys文件


bsh
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文件里


bsh
ssh-keygen -t rsa
这一步网上资料一大把,这里就不赘述了



问题原因

我把公钥一直copy到/root/.ssh/authorized_keys文件里,所以密钥对就一直未奏效,因为服务器压根就没找到公钥(因为我粘贴的位置不对)


在解决了这个问题的过程中,也学习到了ssh配置方面的更多内容,接下来继续和大家分享。

git clone的底层实质就是通过ssh协议来实现的,所以测试ssh连接没问题,git clone也基本就没问题了。


问题追查

网上查了好久试了好久,无果,没办法只能硬着头皮看命令执行的详细信息了


bsh
ssh -T -v bingo@47.100.3.39
T代表测试(test),v代表查看详细信息(view detail)



可以看出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
如果你不知道怎么本地配置多个不同的git账号来对应不同的git项目,那你就有福气了,上面配置正好可以帮到你。



2. 根据host,它会从config锁定到相对应的配置,从而找到私钥文件.ssh/memo

3. 会检查客户端和服务端Openssh的版本号,这里是一致的。本人猜测,不一致或许可能会有影响。

4. .ssh目录下找到know_hosts2文件

因为这一步信息,我错误的认为就是这个导致的,所以上面config文件我额外添加了一行


UserKnownHostsFile ~/.ssh/known_hosts
继续看后面的日志,发现不是这个问题,这一行配置大家可以忽略。



下图是后面的日志信息


从日志里可以看出,命令是有去查找known_hosts文件的。

其次,验证会有4种类型,中间2种我也不清楚,但重点是:


当公钥publickey方式验证不通过时,就会采用password验证的方式


这里password,指的就是在服务端创建的账号密码,即前面这一步你设置的密码:


bsh
passwd bingo
所以这也是前面,为啥服务器没找到我的公钥,却还依然让我输入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的配置,这个是加强信息安全的。关于原理,等我搞懂了,继续和大家分享。


我要评论
评论列表