SSH无密码登录无效

我需要自己搭建一个git服务器,设置好仓库目录后,执行git clone后,每次git push都需要输入密码。于是想到使用ssh的公钥登录的方式。

一、在本地生成public key

1
ssh-keygen -o

得到如下的共有key

1
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDTe/HXz0mpOyzJ6QcCI2/uP/fmU0MLQ3ewglRa0Y2Ym4Jm5tNhjCa40mRTN7eCX7ufCRnTR8JurFURC5dNa5vNAh3JqeiBs1gGaemAe4VjfJzUTtPO9KPyXZRyoa5j4+XOY39al/n2lHz2ydcmncxmdw8JAfx53IZY2ruZAI32h/bgqc8zmz4eqhQn3wGSG81a7vTw7JLWAna6Ey34VxGYJYPTzJJFa+STibESDIea4GFl93xD02/+8ScpqxD419A+XQGtAzypuKX8LAXXdOz9GNS/F2B+wMEYyygzQjQXoKS0lJqcycvC/uF/hy5D/1H5MLMnPKgNpRt7/AgTyfLbFjsy12rdfiQMgTjLhiPJ068GjVpbJhvEO77OB4dawGoATXqOv3oU7V2/N5/cm7aRzdUmNw9/MWfGWPtjMKrhSyCnWNDqH9bh7Lewe0DkL2HsPzV32DISE/qai019R6FmL7N1xNKeGIuixN7uCNjAKQ3HoW8= Administrator@MC-PC1

二、复制公有key到服务器

将本地的公有key复制到服务器的git用户下,路径为【/home/git/.ssh/authorized_keys】

三、执行git push

git的配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
[remote "origin"]
url = git@www.abc.com:/data/gitstore/shidao-dms.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master

执行git push结果如下,可以看到,还是需要输入密码才有效。

image-20210521103521576

四、问题分析

使用ssh登录的工作原理是,客户端连接服务器的时候,服务器向客户端发送一个字符串,客户端收到字符串后使用私钥对该字符串进行加密,然后将密文发送给服务器,服务器用公钥对其进行解密,如果正确,那么就授权登录,如果失败,就决绝。

1、当前是使用的ssh的连接方式吗

使用抓包工具来查看,其实一般不用查看,只要使用的是git@xxx.com:/git/path.git这样的形式,那肯定就是ssh形式

2、客户端使用的是哪个私钥进行加密的

这里有个疑问,家目录下面存在多个私钥,那么系统如何知道使用的是哪个key来进行加密的呢?虽然不知道使用的哪个,那么,如果只要一个私钥文件,那么是不是就不用管了呢?所以如果有多个的时候,删除掉多余的,只保留一个就行了。

3、服务器使用的哪个公钥进行解密的

这个很重要。linux服务器有关于ssh的相关配置。主要的配置在

1
2
3
4
# 配合文件 /etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys # 这里说明了使用哪里的文件授权

配置完毕后,记得要重启ssh服务

1
2
3
4
5
6
7
8
# ubuntu系统
service ssh restart

# debian系统
/etc/init.d/ssh restart

# centos系统
service sshd restart