问题
github提交代码,提示鉴权失败,如下图:
也就是说,从2021年8月13日起,密码验证的git操作方式不再支持,需要使用基于令牌的身份验证模式进行git操作。官网说明请看这里
解决方法
目前根据访问GitHub
仓库的方式有不同的身份验证模式:
- 用户名和密码
- 个人访问令牌(PAT)
- SSH密钥
对于开发来说,身份验证模式可采用 个人访问令牌 或者 SSH密钥。
个人访问令牌
首先到自己的Github账户创建令牌,详细步骤如下:官网说明请看这里
-
在任何页面的右上角,单击您的个人资料照片,然后单击 Settings(设置)。
-
在左侧边栏中,单击 Developer settings。
-
在左侧边栏中,单击 Personal access tokens(个人访问令牌)。
-
单击 Generate new token(生成新令牌)。
-
填写好令牌相关信息,比如令牌名称(note),有效时限(Expiration),令牌的作用域或权限(scopes)等,点击Generate token(生成令牌)。
下面是官网令牌选择权限的图片。
为了省心,我干脆全选了(😄)。
-
保存好生成的令牌字符串。
-
用令牌替换之前的密码即可正常访问github代码仓库。
$ git clone https://github.com/username/repo.git
Username: your_username
Password: your_token(区别就是之前这里填写的是github仓库密码,现在填写令牌)
正常访问到仓库后,系统会自动在钥匙串(mac)或者 管理Windows凭据(window)中生成登录凭证:
可能说的轻松,但实际操作中还是遇到了困难——提交代码报443错误:
fatal: 无法访问 'https://github.com/*****/******.git':LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443
折腾了半天,最终参考这篇文章,解决了问题。方法如下:
git config --global --add remote.origin.proxy "127.0.0.1:(科学上网端口)"
笔者科学上网获取端口截图如下:
SSH密钥
Secure Shell(SSH) (可理解为一种加密的网络协议) 连接到 GitHub ,原理大概如图:
生成密钥对
如上所示,我们需要ssh密钥对:公钥和私钥。 密钥对是跟github账户关联的,所以我们需要针对github账户生成ssh密钥对:
$ ssh-keygen -t ed25519 -C "github邮箱账户"
相关说明:
-t 指定密钥算法,其值有: dsa | ecdsa | ed25519 | rsa(default), 和官网一样这里指定为ed25519。
-C 描述文字,比如邮箱。验证了下,可随意填写
回车后会让你输入密钥对的名称,直接默认回车(如果自定义名称会导致找不到密钥,导致Permission denied (publickey),ssh-agent可解决)。
接着会让你输入密码来保护你的密钥,为了避免每次输入密码(ssh-agent可以解决这个问题),直接回车。
如果电脑本地存在.ssh目录,那么就会在执行指令的目录下生成密钥对。否则会创建.ssh文件夹并在其内生成密钥对。
将公钥添加到github
将生成的公钥id_ed25519.pub
用文本编辑器打开,复制其内容添加到github,步骤:Settings
➡️ SSH and GPG keys
选择New SSH key
, 添加成功后如下图:
验证是否配置成功
$ ssh -T git@github.com
回车后会让你检查GitHub 的 SSH 密钥指纹,直接输入yes即可。
如果出现如下所示,则配置成功。
Hi <GitHub账户名>! You've successfully authenticated, but GitHub does not provide shell access.
更改仓库的地址为SSH地址,验证是否可正常git操作:
这里有些同学或许会有个疑问,如果我有多个代码仓库在不同平台(github, gitee, gitlab, coding等),SSH密钥该如何管理与使用?这里就需要用到SSH密钥管理器:ssh-agent,有兴趣的同学可自行谷歌探索。
以上是我对问题的学习心得,感谢大家的阅读~