目录
使用 SSH 连接 GitHub
您可以使用安全 shell 协议 (Secure Shell Protocol --> SSH) 来连接 GitHub,SSH 能在不安全的网络中提供一个安全的通道。
关于 SSH
使用 SSH 协议,您可以连接远程服务器及服务并对其进行身份验证。使用 SSH 密钥,可以连接到 GitHub,而无需在每次访问时提供用户名和个人访问口令。
当您设置 SSH 时,需要生成一个新的 SSH 密钥,并把它添加到 ssh 代理(agent)中。只有将 SSH 密钥添加到您的 GitHub 账号中,然后才能使用该密钥进行身份验证。有关更多的信息,请参见 “生成新的 SSH 密钥并将其添加到 ssh 代理中” 和 “将新的 SSH 密钥添加到您的 GitH 账号” 。
可以通过使用硬件安全密钥进一步保护 SSH,这要求在使用密钥对进行 SSH 身份验证时,需将物理硬件安全密钥连接到电脑中。也可以通过将密钥添加到 ssh 代理中并使用密码来保护 SSH 密钥。有关详细信息,请参阅 “使用 SSH 密钥密码” 。
若要将 SSH 密钥与使用 SAML 单点登录的组织拥有的仓库一起使用,必须对该密钥进行授权。有关更多信息,请参阅 GitHub 企业云文档中的 “授权 SSH 密钥用于 SAML 单点登录” 。
为了维护账号安全,您可以定期检查您的 SSH 密钥列表,并撤销任何无效或已被破坏的密钥。有关更多的信息,请参见 “检查 SSH 密钥” 。
如果您已经有一年时间没有使用 SSH 密钥,那么,为了以防万一,GitHub 将自动删除您的非活动的 SSH 密钥。有关详细信息,请参见 “删除或丢失的 SSH 密钥” 。
使用 GitHub 企业云的组织可以提供 SSH 证书,其组织成员可以使用该证书访问该组织的仓库,而无需将该证书添加到他们在 GitHub 上的账户中。如果您使用的是 SSH 证书,那么如果该分支属于您的个人账户,则无法使用该证书访问组织仓库的分支。有关更多信息,请参见 GitHub 企业云文档中 “关于 SSH 证书颁发机构” 。
检查现有 SSH 密钥
在生成一个新的 SSH 密钥之前,可以先检查是否已有任何现存的 SSH 密钥。
注意:
GitHub 在2022年3月15日通过删除旧的、不安全的密钥类型来提升安全性。
从那时起,不再支持 DSA 密钥(ssh-dss)。您无法在`GitHub.com`上为您的个人账户添加新的 DSA 密钥。
在2021年11月2日之前,带有 valid_after 的 RSA 密钥(ssh-rsa)可以继续使用任何签名算法。
之后生成的 RSA 密钥必须使用 SHA-2 签名算法。一些较老的客户端可能需要升级才能使用 SHA-2 签名。
检查步骤:
- 打开终端(Mac、Linux)或者打开
Git Bash
(windows)。 - 输入
ls -al ~/.ssh
,查看是否存在现有的 SSH 密钥。
$ ls -al ~/.ssh
# 如果 .ssh 目录中有文件,则会列出这些文件
-
检查该目录下的文件列表,看看是否已经有了公共的 SSH 密钥。默认情况下,GitHub 支持的公钥的文件名如下。
- id_rsa.pub
- id_ecdsa.pub
- id_ed25519.pub
提示:如果您收到一个
~/.ssh
目录不存在的错误,则表示在默认位置没有存在 SSH 密钥对。
您可以在下一步中创建一个新的 SSH 密钥对。 -
要么生成新的 SSH 密钥,要么上传现有的密钥。
- 如果您没有支持的公钥和私钥对,或者不希望使用任何可用的密钥对,那么生成一个新的 SSH 密钥。
- 如果您看到列出了您想要用于连接 GitHub 现有的公钥和私钥对(例如,id_rsa.pub 和 id_rsa),则可以将该密钥添加到 ssh 代理中。
有关生成新的 SSH 密钥或者向 ssh 代理添加现有密钥的详细信息,请参阅 “生成新的 SSH 密钥并将其添加到 ssh 代理中” 。
生成新的 SSH 密钥并把它添加到 ssh 代理中
在检查了现有的 SSH 密钥之后,可以生成一个新的用于身份验证的 SSH 密钥,然后将其添加到 ssh 代理中。
关于生成 SSH 密钥
如果您还没有一个 SSH 密钥,那么必须生成一个新的 SSH 密钥用于身份验证。如果不确定是否已经有了 SSH 密钥,可以检查现有密钥。有关详细信息,请参阅 “检查现有 SSH 密钥” 。
如果您想使用硬件安全密钥对 GitHub 进行身份验证,则您必须为硬件安全密钥生成一个新的 SSH 密钥。使用该密钥对进行身份验证时,必须将硬件安全密钥连接到电脑。有关更多信息,请参阅 “OpenSSH 8.2 发行说明” 。
如果您不想在每次使用 SSH 密钥时都重新输入密码,可以将密钥添加到 SSH 代理中,该代理管理 SSH 密钥并记住您的密码。
生成新的 SSH 密钥
-
打开终端(Mac 或 Linux)或者打开
Git Bash
(windows)。 -
粘贴以下的文本,并替换为您的 GitHub 电子邮件地址。
$ ssh-keygen -t ed25519 -C "your_email@example.com"
注意: 如果您使用的是不支持 Ed25519 的传统系统,请使用:
$ ssh-keygen -t rsa -b 4096 -C "your_email@example"
这将使用提供的电子邮件作为标签创建一个新的 SSH 密钥。
> Generating public/private algorithm key pair.
# 生成公共/私有算法密钥对。
-
当提示您“输入保存密钥文件”时,直接按回车。这会接受默认的文件位置。
> Enter a file in which to save the key (/home/you/.ssh/algorithm): [Press enter] # 输入用于保存该密钥的文件(/home/you/.ssh/algorithm):[按回车]
-
在提示符下,键入一个安全密码。有关详细信息,请参阅 “使用 SSH 密钥密码” 。
> Enter passphrase (empty for no passphrase): [Type a passphrase] > Enter same passphrase again: [Type passphrase again] # 输入密码(不输入表示没有密码)[键入一个密码] # 再次输入密码:[再次键入密码]
将 SSH 密钥添加到 ssh 代理中
在向 ssh 代理添加新的 SSH 密钥以管理密钥之前,您应该检查现有的 SSH 密钥,并生成新的 SSH 密钥。
-
在后台启动 ssh 代理。
$ eval "$(ssh-agent -s)" > Agent pid 59566 # 代理进程id为59566
根据您的环境不同,您可能需要使用了不同的命令。例如,在启动 ssh 代理之前,可能需要通过运行
sudo -s -H
来使用 root 访问,或者,可能需要使用exec ssh-agent bash
或exec ssh-agent zsh
来运行ssh-agent
。 -
把您的 SSH 私钥添加到 ssh 代理中。如果您创建密钥时使用不同的名称,或者添加带有不同名称的现存密钥,则请用您私钥文件名替换以下命令中的
id_ed25519
。$ ssh-add ~/.ssh/id_ed25519
-
把 SSH 密钥添加到 GitHub 上您的账号中。有关详细信息,请参阅 “将新的 SSH 密钥添加到您的 GitHub 账号中” 。
为硬件安全密钥创建新的 SSH 密钥
如果您正在使用 macOS 或 Linux 系统,那么在生成新的 SSH 密钥之前,可能需要更新您的 SSH 客户机或安装新的 SSH 客户机。有关更多信息,请参阅 “错误:未知密钥类型” 。
-
将您的硬件安全密钥插入电脑中。
-
打开终端或
Git Bash
。 -
粘贴以下文本,并用您在 GitHub 上的账号替换其中的电子邮件地址。
$ ssh-keygen -t ed25519-sk -C "your_email@example.com"
**注意:**如果命令执行失败,并收到错误
invalid format
(无效格式)或feature not suppoted
(功能不支持),那么您可能使用了不支持 Ed25519 算法的硬件安全密钥。改为键入以下命令。$ ssh-keygen -t ecdsa-sk -C "your_email@example.com"
-
当出现提示时,触摸硬件安全密钥上的按钮。
-
当提示“输入保存密钥的文件”时,按回车以接受默认的文件位置。
> Enter a file in which to save the key (/home/you/.ssh/id_ed25519_sk): [Press enter] # 输入用于保存密钥的文件 (/home/you/.ssh/id_ed25519_sk):[按回车]
-
当提示输入密码时,按回车。
> Enter passphrase (empty for no passphrase): [Type a passphrase] # 输入密码(不输入则密码为空):[输入密码] > Enter same passphrase again: [Type passphrase again] # 再次输入相同的密码:[再次输入密码]
-
将 SSH 密钥添加到您的 GitHub 账号中。有关更多信息,请参见 “将新的 SSH 密钥添加到您的 GitHub 账号中” 。
将新的 SSH 密钥添加到您的 GitHub 账号中
在 GitHub.com 上配置您的账号以使用新的(或现有的)SSH 密钥,您还需要将该密钥添加到您的账号中。
在将新的 SSH 密钥添加到 GitHub.com 上账号中之前,您必须已经执行以下操作:
在将新的 SSH 密钥添加到 GitHub.com 上您的账号后,您可以重新配置任何本地仓库以便使用 SSH。有关更多信息,请参阅 “将远程 URLs 从 HTTPS 切换到 SSH” 。
注意:2002年3月15日,GitHub通过弃用旧的、不安全的密钥类型以提高安全性。
自那天后,DSA密钥(`ssh-dss`)不再支持。您不能把新的 DSA 密钥添加到 GitHub.com 上的个人账号中。
在2021年11月2日之前,带有 `valid_after` 的RSA密钥(ssh-rsa)可以继续使用任何签名算法。
在那天之后,要生成RSA密钥必须使用 SHA-2 签名算法。一些老的客户端可能需要进行升级以使用 SHA-2 签名。
以下步骤有两种方法,即可以使用 GitHub CLI,或 使用浏览器。
GitHub CLI(命令行接口)
想要了解有关 GitHub CLI 的更多信息,请参见"关于 GitHub CLI" 。
在使用 GitHub CLI 向您的账号添加 SSH 密钥之前,必须对 GitHub CLI 进行身份验证。有关更多信息,请参见 GitHub CLI 文档中的 gh auth login。
要向 GitHub 账号中添加 SSH 密钥,请使用 ssh-key add
子命令,并指定公钥。
gh ssh-key add key-file
若要为新的密钥包含一个标题,请使用 -t
或 --titile
标志。
gh ssh-key add key-file --titile "personal laptop"
如果您是按照 “生成一个新的 SSH 密钥” 中的说明生成了 SSH 密钥,那么您可以使用以下命令将该密钥添加到您的账号中。
gh ssh-key add ~/.ssh/id_ed25519.pub
浏览器
-
拷贝 SSH 公钥到剪贴板。
如果您的 SSH 公钥文件的名称与示例代码中的不同,请修改文件名以匹配当前设置。在复制密钥时,不要添加任何新行或空格。
Mac 中使用以下命令:
$ pbcopy < ~/.ssh/id_ed25519.pub # 将 id_ed25519.pub文件拷贝到剪贴板中
提示:如果
pbcopy
不起作用,则您可以切换到隐藏的.ssh
文件夹中,使用您喜欢文本编辑器打开该文件,然后复制内容到剪贴板中。windows 中使用以下命令:
$ clip < ~/.ssh/id_ed25519.pub # 将 id_ed25519.pub文件拷贝到剪贴板中
提示:如果
clip
不起作用,则您可以切换到隐藏的.ssh
文件夹中,使用您喜欢文本编辑器打开该文件,然后复制内容到剪贴板中。Linux 中使用以下命令:
$ cat ~/.ssh/id_ed25519.pub # 然后选择终端上显示的id_ed25519.pub文件内容,并复制到剪贴板
提示:或者,您可以切换到隐藏的
.ssh
文件夹中,使用您喜欢文本编辑器打开该文件,然后复制内容到剪贴板中。 -
在任何页面的右上角,单击您的个人资料照片,然后单击
Settings
(配置)。
-
在左侧边栏的 “Access” 节,点击
SSH and GPG keys
。 -
单击
New SSH key
或者Add SSH key
。 -
在
Title
字段中,为新密钥填入描述性的标签。例如,如果您使用的是个人 Mac,则你可能称呼这个密钥为personal MacBook Air
。 -
粘贴您的密钥到
key
字段中。 -
点击
Add SSH key
。 -
如果有提示,请确认您的 GitHub 密码。
测试 SSH 连接
在设置好 SSH 密钥并将其添加到 GitHub.com 上的账号后,您可以测试连接。
在进行 SSH 连接测试前,您应该已经完成以下步骤:
在测试连接时,需要使用您的密码验证此操作,该密码是您在前面创建 SSH 密钥的密码。有关使用 SSH 密钥的密码,请参阅 “使用 SSH 密钥密码” 。
-
打开终端(Mac 或 Linux),或打开
Git Bash
。 -
输入以下命令:
$ ssh -T git@github.com # 试图通过 ssh 连接 GitHub
你可能会看到如下的警告:
> The authenticity of host 'github.com (IP ADDRESS)' can't be established. > RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8. > Are you sure you want to continue connecting (yes/no)? # 无法确定主机 'github.com (IP 地址)'的真实性。RSA密钥指纹是 SHA256:...... # 您确定要继续连接(是/否)?
-
验证您看到的指纹是否与 GitHub 的公钥指纹匹配。如果匹配,那么输入
yes
:> Hi username! You've successfully authenticated, but GitHub does not > provide shell access. # 嘿 您的姓名!您已经成功地进行了身份认证,但是GitHub不提供 shell 访问。
您可能会看到如下的错误信息:
... Agent admitted failure to sign using the key. debug1: No more authentication methods to try. Permission denied (publickey). # 代理接受使用该密钥签名失败。 # debug1:不必再尝试身份验证方法。 # 权限拒绝(公钥)。
这是某些 Linux 发行版的一个已知问题。有关更多信息,请参见 “错误:代理承认签名失败” 。
-
验证结果消息是否包含您的用户名。如果您收到“权限拒绝”消息,请参阅 “错误:权限拒绝(公钥)” 。
使用 SSH 密钥密码
可以保护 SSH 密钥并配置身份验证代理,这样您就不必再每次使用 SSH 密钥时重新输入密码。
使用 SSH 密钥,如果有人获得了对您的电脑的访问权限,则他们也将获得对使用该密钥的每个系统的访问权限。想要增加额外的安全层,可以在 SSH 密钥中添加密码。您可以使用 ssh-agent 安全地保存密码,这样就不必重新输入密码。
增加或修改密码
通过键入以下命令,您可以修改现有私钥的密码,而无需重新生成密钥对:
$ ssh-keygen -p -f ~/.ssh/id_ed25519
> Enter old passphrase: [Type old passphrase]
> Key has comment 'your_email@example.com'
> Enter new passphrase (empty for no passphrase): [Type new passphrase]
> Enter same passphrase again: [Repeat the new passphrase]
> Your identification has been saved with the new passphrase.
如果您的密钥已经有了密码,那么会提示输入旧密码,然后您可以更改为新的密码。
Mac 中在密钥链中保存密码
在 Mac OS X Leopard 上通过 OS X El Capitan 自动处理这些默认私钥文件:
- .ssh/id_rsa
- .ssh/identity
第一次使用密钥时,系统会提示您输入密码。如果您选择使用密钥链保存密码,则不必再次输入。
否则,在将密钥添加到 ssh-agent 时,可以将密码存储在密钥链中。有关更多信息,请参见 “将 SSH 密钥添加到 ssh-agent 中” 。
在 Git for windows 上自动启动 ssh-agent
当打开 bash 或 Git shell 时,会自动运行 ssh-agent。复制以下代码,并粘贴到 Git shell 中的 ~/.profile
或 ~/.bashrc
。
env=~/.ssh/agent.env
agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }
agent_start () {
(umask 077; ssh-agent >| "$env")
. "$env" >| /dev/null ;
}
agent_load_env
# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2=agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)
if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
agent_start
ssh-add
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
ssh-add
fi
unset env
如果您的私钥没有存储在默认位置(例如 ~/.ssh/id_rsa
),您需要告诉 SSH 身份验证代理在哪里找到它。要将密钥添加到 ssh-agent
中,键入 ssh-add ~/path/to/my_key
。有关更多信息,请参见 “生成新的 SSH 密钥并将其添加到 ssh-agent 中” 。
提示:如果希望ssh-agent在一段时间后忘记您的密钥,可以通过运行 `ssh-add -t <seconds>` 来配置它。
至此,当您第一次运行 Git Bash
时,系统会提示您输入密码:
> Initializing new SSH agent...
> succeeded
> Enter passphrase for /c/Users/you/.ssh/id_rsa:
> Identity added: /c/Users/you/.ssh/id_rsa (/c/Users/you/.ssh/id_rsa)
> Welcome to Git (version 1.6.0.2-preview20080923)
>
> Run 'git help git' to display the help index.
> Run 'git help ' to display help for specific commands.
ssh-agent 进程将继续运行,直到您注销、关闭电脑或终止该进程。
原文地址:使用SSH连接GitHub