未分类

git 权限设置(ssh)

git权限设置


背景

入职后换了新电脑,使用SSH URLS的方式clone项目,由于没有将新生成的SSH秘钥添加到gitlab的配置中,导致项目拉取不成功,根据报错信息,了解到是权限问题。

以本人github为例,复现报错信息
首先复制ssh仓库地址

随便clone一个项目,报错

Git权限校验的两种方式

  • 1️⃣HTTPS

    仔细看第一幅图,不难发现除了ssh,在Clone or download按钮下还有Use HTTPS字样。该种方式适用面更广(即使在有防火墙或代理的情况下也同样适用),使用更方便(配置更简单)。

    采用HTTPS URLs地址clone/fetch/pull/push仓库时,事先无需对本地系统进行任何配置,只需要输入GitHub的账号和密码即可。不过如果每次都要手动输入账号密码,在Mac系统中,在启用Keychain机制的情况下,首次输入GitHub账号密码后,认证信息就会自动保存到系统的Keychain中,下次再次访问仓库时就会自动读取Keychain中保存的认证信息。关于HTTPS的部分不作为本次重点内容。

  • 2️⃣SSH

    我们重点说SSH的部分,在使用SSH URLS的方式之前,我们需要生成SSH秘钥对(分为私钥和公钥)
    ssh-keygen指令用于创建、管理和转换认证SSH秘钥对,有两种类型RSA和DSA,其实是两种不同加密算法得出的不同秘钥,创建的指令为
    ssh-keygen -t rsa -b 4096 -C “xxx@xxxx.com”

    -t: type的缩写,用来指定秘钥类型(rsa/dsa)后边跟rsa就是创建rsa类型
    -b: bit的缩写,对于RSA密钥,最小要求768位,默认是2048位。命令中的4096指的是RSA密钥长度为4096位。DSA密钥必须恰好是1024位
    -C “邮箱”: comment的缩写,-C表示要提供一个新注释,用于识别这个密钥,所以“”里面不一定非要填邮箱,可以是任何内容,邮箱仅仅是识别用的key
    总结:当你创建ssh的时候:-t 表示密钥的类型 ,-b表示密钥的长度,-C 用于识别这个密钥的注释 ,这个注释你可以输入任何内容,很多网站和软件用这个注释作为密钥的名字

    秘钥对创建好以后,私钥存放于本地计算机(~/.ssh/id_rsa),将公钥(~/.ssh/id_rsa.pub)中的内容添加至GitHub账户。
    cat id_rsa.pub指令用于查看ssh秘钥,我们需要查看的是公钥,所以使用cat查看文件命令查看结尾有.pub的那一个文件,把公钥拷贝到git配置中再次拉取项目,成功!

    ps:检测本地计算机与GitHub的连接状态,会发现系统仍提示权限校验失败。



    Tips:
    单独采用秘钥的时候,秘钥的保存很关键,一旦这个私钥被别人拷走,就像别人配了一把你家的钥匙,可以随便进出,所以在创建秘钥的过程中,系统还建议创建一个名为passphrase的东西。只有同时具备SSH private key和passphrase的情况下,才能通过SSH的权限校验,这就大大地增加了安全性。当然,这个passphrase也不是必须的,在创建秘钥对时也可以不设置passphrase。



SSH提供两种方式的登录验证:

1、密码(口令)验证:以服务器中本地系统用户的登录名称,密码进行验证。
2、密钥对验证:要求提供相匹配的秘钥信息才能通过验证。通常先在客户机中创建一对密钥文件(公钥和私钥),然后将公钥文件放到服务器中的指定位置。

密码(口令)验证的整个过程是:
(1)远程主机收到用户的登录请求,把自己的公钥发给用户。
(2)用户使用这个公钥,将登录密码加密后,发送回来。
(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。
(感觉类似于三次握手?!🤷‍)



git主要使用密钥对验证,该方法的过程是:
(1) 首先在客户端生成一对密钥(ssh-keygen);
(2) 并将客户端的公钥ssh-copy-id 拷贝到服务端;
(3) 当客户端再次发送一个连接请求,包括ip、用户名;
(4) 服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生成一个字符串,例如:qwer;
(5) 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端;
(6) 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端;
(7) 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录。

Question

1.ssh -T git@github.com 检验的意义?
2.ssh-agent的作用?

  1. 密码(口令)验证过程?

参考链接:
debugtalk的博客
阮一峰的博客
https://www.cnblogs.com/hukey/p/6248468.html