起源
今日在GitHub新建项目后使用HTTPS提交代码失败,无论是使用代码管理工具SourceTree还是命令行都不行。
查看报错日志:fatal: ServicePointManager 不支持具有 socks5 方案的代理。
remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead. remote: Please see github.blog/2020-12-15-… for more information. fatal: Authentication failed for ‘github.com/hmis-sdu/nc…
刚开始先排查的是网络代理问题。经排查不是,仔细看日志, Please use a personal access token instead.
应该是新项目需要使用SSH方式提交代码。
生成新的 SSH 密钥并配置GitHub
查看是否已存在密钥对,windows环境下默认在C盘:C/Users/{{用户名}}/.ssh/{{id_ALGORITHM}}
。这里我们只介绍新生成情况。
生成新 SSH 密钥
-
打开Git Bash或者PowerShell。
-
粘贴以下文本,将示例中使用的电子邮件
your_email@example.com
替换为 GitHub 电子邮件地址。ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
这将以提供的电子邮件地址为标签创建新 SSH 密钥。
这里不建议使用GitHub推荐的Ed25519算法。尝试之后Ed25519算法生成的密钥对可能会出现校验问题。
当系统提示您“Enter a file in which to save the key(输入要保存密钥的文件)”时,可以按 Enter 键接受默认文件位置。这里也建议你直接回车默认操作。
Enter file in which to save the key (/c/Users/YOU/.ssh/id_ALGORITHM):[Press enter]
-
在提示符下,键入安全密码。类似手机解锁码。
> Enter passphrase (empty for no passphrase): [Type a passphrase] > Enter same passphrase again: [Type passphrase again]
将 SSH 密钥添加到 ssh-agent
-
在管理员权限的PowerShell窗口中,确保 ssh-agent 正在运行。
# start the ssh-agent in the background Get-Service -Name ssh-agent | Set-Service -StartupType Manual Start-Service ssh-agent
这点很重要,不然后面出问题查不到原因。已踩坑。 可以查询ssh-agent状态。
Get-Service ssh-agent
-
将 SSH 私钥添加到 ssh-agent。
ssh-add C:/Users/{{用户名}}/.ssh/id_rsa
-
将 SSH 公钥复制到剪贴板。
cat ~/.ssh/id_rsa.pub
将显示的公钥复制下来备用。在复制密钥时,请勿添加任何新行或空格。
向GitHub帐户添加新的 SSH 密钥
- 在 GitHub 任意页面的右上角,单击个人资料照片,然后单击Settings。
- 在边栏的“访问”部分中,单击 “SSH 和 GPG 密钥”。
-
单击“新建 SSH 密钥”或“添加 SSH 密钥” 。
-
在 "Title"(标题)字段中,为新密钥添加描述性标签。
-
选择密钥类型(身份验证或签名)。
-
在“密钥”字段中,粘贴公钥。
-
单击“添加 SSH 密钥”。
测试 SSH 连接
-
在PowerShell窗口中,输入以下内容:
ssh -T git@github.com # Attempts to ssh to GitHub
上述命令无需替换和修改。
可能会看到类似如下的警告:
> The authenticity of host 'github.com (IP ADDRESS)' can't be established. > ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU. > Are you sure you want to continue connecting (yes/no)?
-
验证所看到消息中的指纹是否与 GitHub 的公钥匹配。 如果是,则键入 yes:
> Hi {{USERNAME}}! You've successfully authenticated, but GitHub does not > provide shell access.
这里后半句
but GitHub does not provide shell access.
可以忽略。
SourceTree配置
打开 工具-->选项-->SSH客户端配置
SSH密钥选择密钥文件。SSH客户端选择OpenSSH。
常见问题
Permission denied (publickey)
“权限被拒绝”错误表示服务器拒绝了您的连接。 可能有多个原因。
常见原因:
-
SSH 密钥未配置或者配置错误。
如果本地机器没有配置 SSH 密钥对,或者密钥对没有正确注册到 GitHub 账户上,连接便会失败。
-
本地私钥文件的权限设置不正确。
如果私钥文件的权限过于宽泛,例如对所有用户开放读写,SSH 客户端将拒绝加载该密钥,因为它不安全。
-
多 SSH 密钥配置不当。
有时候一个开发者会配置多个 SSH 密钥,而 Git 不知道使用哪一个密钥进行身份验证,导致认证失败。
-
SSH Agent 未启动或密钥未加入 Agent。
SSH Agent 主要用来管理用户的 SSH 密钥,保证无需每次手动输入私钥密码。如果 Agent 没有启动或密钥没有添加,连接会失败。
解决问题的详细步骤
-
检查 SSH 密钥是否存在
可以直接在文件夹查看
-
检查 GitHub 账户中 SSH 公钥是否正确
cat ~/.ssh/id_rsa.pub
使用命令行或者记事本打开上述文件,复制,确保与 GitHub 账户中的公钥一致。
-
检查 SSH 配置文件(略)
配置了多个 SSH 密钥时候使用。
-
检查本地私钥权限(略)
我反正设了管理员权限。
-
确保 SSH Agent 正常运行
参考上面章节。这是我踩坑的地方。
-
测试 SSH 连接
参考上面章节。
ssh -T git@github.com
测试 SSH 连接时使用上面命令行,无需更换里面内容。这也是我踩坑的地方。