Connecting to GitHub with SSH

本文最后更新于:2020年7月4日 晚上

通过SSH连接到GitHub

整理自GitHub官方帮助文档:https://help.github.com/articles/connecting-to-github-with-ssh

一、关于SSH

使用SSH协议,您可以连接和验证远程服务器和服务。通过使用SSH密钥,您可以在每次访问GitHub时无需提供用户名或密码。

设置SSH时,您将生成SSH密钥并将其添加到ssh-agent,然后将密钥添加到您的GitHub帐户。将SSH密钥添加到ssh-agent可确保您的SSH密钥通过使用密码短语拥有更多一层的安全。有关更多信息,请参阅“ Working with SSH key passphrases”。

建议定期查看SSH密钥列表,并废除无效或已被盗用的密钥。

如果您的SSH密钥未使用超过一年,那么GitHub将自动删除您不活跃的SSH密钥以确保安全。有关更多信息,请参阅“Deleted or missing SSH keys”。

二、检查现有的SSH密钥

本文仅介绍Windows系统的相关操作

Mac或Linux请参考官方帮助文档:https://help.github.com/en/articles/checking-for-existing-ssh-keys

在生成SSH密钥之前,您可以检查是否本地已存在SSH密钥。

注意:在OpenSSH 7.0中不推荐使用DSA密钥。如果您的操作系统使用OpenSSH,则在设置SSH时需要使用RSA密钥或其他类型类型的密钥。例如,如果您的操作系统是MacOS Sierra,则可以使用RSA密钥设置SSH。

1.打开终端Git Bash。

2.输入ls -al ~/.ssh查看是否系统中已存在SSH密钥:

$ ls -al ~/.ssh
# Lists the files in your .ssh directory, if they exist

3.查看您的列表中是否已存在公共SSH密钥。

默认情况下,公钥的文件名是以下之一:

id_dsa.pub
id_ecdsa.pub
id_ed25519.pub
id_rsa.pub
  • 如果您的系统中不存在公钥和私钥对,或者没有任何可用的密钥可以连接到GitHub,那么你可以生成新的SSH密钥
  • 如果列表中存在用于连接到GitHub 的现有公钥和私钥对(例如id_rsa.pubid_rsa),则可以将SSH密钥添加到ssh-agent

提示:如果终端返回〜/ .ssh不存在的错误,不用担心!我们将在生成新的SSH密钥时创建它。

三、生成新的SSH密钥并将其添加到ssh-agent

本文仅介绍Windows系统的相关操作

Mac或Linux请参考官方帮助文档:https://help.github.com/en/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent

检查现有SSH密钥后,可以生成用于身份验证的新的SSH密钥并将其添加到ssh-agent。

如果您还没有SSH密钥,则必须生成新的SSH密钥。如果您不确定是否已有SSH密钥,请检查现有密钥

如果您不想在每次使用SSH密钥时重新输入密码,则可以将密钥添加到SSH agentSSH agent会管理您的SSH密钥并记住您的密码。

生成新的SSH密钥

注意:如果您还没有SSH密钥,则必须生成新的SSH密钥。否则直接跳到下一步将现有的SSH密钥添加到ssh-agent中。

1.打开Git Bash.

2.粘贴下面的文本,用您的GitHub邮箱地址替换双引号中的内容。

$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

这将使用您提供的电子邮件作为标记创建一个新的ssh密钥。

> Generating public/private rsa key pair.

3.当系统提示您 “Enter a file in which to save the key” 时,按Enter键。密钥将保存在默认的路径下。

> Enter a file in which to save the key (/c/Users/you/.ssh/id_rsa):[Press enter]

4.根据提示,您需要输入密码。更多信息请查看“Working with SSH key passphrases”

> Enter passphrase (empty for no passphrase): [Type a passphrase]
> Enter same passphrase again: [Type passphrase again]

将SSH密钥添加到ssh-agent

在将新的SSH密钥添加到ssh-agent以管理密钥之前,您应该检查现有的SSH密钥生成新的SSH密钥

如果安装了GitHub Desktop,则可以使用它来克隆存储库而不处理SSH密钥。它还附带了Git Bash工具,这是git在Windows 上运行命令的首选方式。

1.确保ssh-agent正在运行:

  • 如果您使用的Git Shell是随着GitHub Desktop一起安装的,那么ssh-agent应该在运行中。

  • 如果您使用的时其它命令提示符终端,例如Git for Windows,则可以使用“Working with SSH key passphrases”中所说的“Auto-launching the ssh-agent”,或者通过以下命令手动启动:

    # start the ssh-agent in the background
    $ eval $(ssh-agent -s)
    > Agent pid 59566

2.将SSH私钥添加到ssh-agent。如果您使用了其他名称创建密钥,或者要添加不同名称的已有的密钥,请将如下命令中的id_rsa替换为您的私钥文件的名称。

$ ssh-add ~/.ssh/id_rsa

3.将SSH密钥添加到您的GitHub帐户。

四、添加一个新的SSH密钥到您的GitHub帐户

要配置您的GitHub帐户使用新的(或现有的)SSH密钥,还需要将其添加到GitHub帐户中。

在向GitHub帐户添加新的SSH密钥之前,您应该已经做了一下两步:

在您的GitHub帐户中添加新的SSH密钥后,您可以重新配置所有的本地存储库以使用SSH。更多信息,请参阅“Switching remote URLs from HTTPS to SSH”。

注意:在OpenSSH 7.0中不推荐使用DSA密钥。如果您的操作系统使用OpenSSH,则在设置SSH时需要使用RSA密钥或其他类型类型的密钥。例如,如果您的操作系统是MacOS Sierra,则可以使用RSA密钥设置SSH。

1.将SSH密钥复制到剪贴板。

如果您的SSH密钥文件的名称与示例代码不同,请根据您的文件名修改以下命令并执行。复制密钥时,请勿添加任何换行符或空格。

$ clip < ~/.ssh/id_rsa.pub
# Copies the contents of the id_rsa.pub file to your clipboard

提示:如果clip不起作用,您可以找到隐藏的.ssh文件夹,用文本编辑器打开密钥文件,然后将其中的内容复制到剪贴板。

2.在GitHub任意页面的右上角,单击您的头像,然后单击“Settings”

用户栏中的“设置”图标

3.在用户设置侧栏中,单击SSH and GPG keys

验证密钥

4.单击“New SSH key”或“ Add SSH key”。

SSH密钥按钮

5.在“Title”文本框中,为新密钥添加描述性标签。例如,如果您使用的是个人Mac,则可以将此键称为“Personal MacBook Air”。

6.将您的密钥粘贴到“Key”对应得文本框。

关键领域

7.单击“Add SSH key”。

添加键按钮

8.如果出现提示,请输入您的GitHub密码以确认。

Sudo模式对话框

五、测试SSH连接

本文仅介绍Windows系统的相关操作

Mac或Linux请参考官方帮助文档:https://help.github.com/en/articles/testing-your-ssh-connection

在设置SSH密钥并将其添加到GitHub帐户后,您可以测试您的连接。

在测试SSH连接之前,您应该已经做了以下几步:

测试连接时,您需要使用您之前创建SSH密钥时的密码验证此操作。有关使用SSH密钥密码的更多信息,请参阅“Working with SSH key passphrases”。

1.打开Git Bash。

2.输入以下内容:

$ ssh -T git@github.com
# Attempts to ssh to GitHub

您可能会看到如下提示信息:

> The authenticity of host 'github.com (IP ADDRESS)' can't be established.
  > RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
  > Are you sure you want to continue connecting (yes/no)?

或者像这样:

> 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)?

3.验证您看到的信息中的编码是否与步骤2中的某条信息匹配,然后输入yes

> Hi username! You've successfully authenticated, but GitHub does not
> provide shell access.

4.验证生成的消息是否包含您的用户名。如果返回“permission denied”,请参阅“Error: Permission denied (publickey)”。

六、使用SSH密钥密码

您可以加密SSH密钥并配置身份验证代理,这样您就不必在每次使用SSH密钥时重新输入密码。

使用SSH密钥,如果有人获得对您计算机的访问权限,他们也可以访问使用该密钥的每个系统。要添加额外的安全层,可以对SSH密钥添加密码。您可以使用ssh-agent来安全地保存您的密码,这样您就不必重新输入密码。

添加或更改密码

您可以通过键入以下命令来更改现有私钥的密码,而无需重新生成密钥对:

$ ssh-keygen -p
# Start the SSH key creation process
> Enter file in which the key is (/Users/you/.ssh/id_rsa): [Hit enter]
> Key has comment '/Users/you/.ssh/id_rsa'
> Enter new passphrase (empty for no passphrase): [Type new passphrase]
> Enter same passphrase again: [One more time for luck]
> Your identification has been saved with the new passphrase.

如果您的SSH密钥已有密码,系统会提示您输入原密码,验证后才能更改为新密码。

在Git for Windows上自动启动ssh-agent

如果您使用的是与GitHub Desktop一起安装的Git Shell,则无需执行以下步骤。GitHub Desktop会自动为您启动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/id_dsa),那么您需要告知您的SSH身份验证代理在哪里找到它。要将你的SSH密钥添加到ssh-agent,请键入ssh-add ~/path/to/my_key。更多信息,请参阅“Generating a new SSH key and adding it to the 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进程将持续运行,直到您注销,关闭计算机或终止这个进程。