Git配置ssh-key

536 阅读7分钟

关于 SSH

使用 SSH 协议可以连接远程服务器和服务并向它们验证。 利用 SSH 密钥可以连接到 GitHub,而无需在每次访问时都提供用户名和 personal access token。

检查现有SSH密钥

ls -al ~/.ssh 

如果已经有密钥会返回信息

如果收到错误提示 ~/.ssh 不存在,表明默认位置没有ssh密钥,可以新建ssh 密钥

生成新的SSH密钥

在生成新的SSH密钥前,先检查下 我们使用的git平台(github,gitlab,gitee等等)支持的算法

  1. 打开终端
  2. 粘贴一下文本命令,将示例中使用的电子邮件替换为 GitHub 电子邮件地址。其中的-C "your_email@example.com" 实际上是一条注释信息,可以填写成你的邮箱地址,并不影响生成密钥的过程。
ssh-keygen -t ed25519 -C "your_email@example.com"

注意:如果你使用的是不支持 Ed25519 算法的旧系统,请使用以下命令:

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

当系统提示您“Enter a file in which to save the key(输入要保存密钥的文件)”时,可以按 Enter 键接受默认文件位置。 请注意,如果以前创建了 SSH 密钥,则 ssh-keygen 可能会要求重写另一个密钥,在这种情况下,我们建议创建自定义命名的 SSH 密钥。 为此,请键入默认文件位置,并将 id_ALGORITHM 替换为自定义密钥名称。

Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/tojoy/.ssh/id_ed25519):[回车使用默认路径,也可以输入指定自定义文件密钥名称]
Created directory '/Users/tojoy/.ssh'.
Enter passphrase (empty for no passphrase):[可输入密钥密码]
Enter same passphrase again:[再次输入密钥密码]
Your identification has been saved in /Users/tojoy/.ssh/id_ed25519
Your public key has been saved in /Users/tojoy/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:BjlFiHdNt3tI95XnKimBpUV2mhBinfm0jOL9JeG+YDg your_email@example.com
The key's randomart image is:
+--[ED25519 256]--+
|     .o+=*+ o    |
|    ..o+=+o= .  .|
|     .+. ==.o ..o|
|      .o.==. + oo|
|     . oS...o . o|
|      .o. o..o . |
|      E oo.oo .  |
|       o .o. .   |
|          ..     |
+----[SHA256]-----+

~/.ssh/id_ed25519 是私钥,保护好私钥,不要暴露在网络中

~/.ssh/id_ed25519.pub 是公钥

向git账户添加SSH密钥

1.将SSH公钥复制

2.在任何页面的右上角,单击个人资料照片,然后单击“设置”。

  1. 在边栏的“访问”部分中,单击 “SSH 和 GPG 密钥”。
  2. 单击“新建 SSH 密钥”或“添加 SSH 密钥” 。
  3. 在 "Title"(标题)字段中,为新密钥添加描述性标签。 例如,如果使用的是个人笔记本电脑,则可以将此密钥称为“个人笔记本电脑”。
  4. 选择密钥类型(身份验证或签名)。 有关提交签名的详细信息,请参阅“关于提交签名验证”。
  5. 在“密钥”字段中,粘贴公钥。
  6. 单击“添加 SSH 密钥”。

测试 SSH 连接

打开终端,输入以下内容:

ssh -T git@github.com //clone with ssh git服务器域名地址 
// colne 选择的 ssh 仓库地址 git@gitlab.tdcq.com

您可能会看到类似如下的警告:

> 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.

显示连接成功!

如果收到“权限被拒绝”消息,极大多数情况是由于github账号没有设置ssh公钥信息所致。

github 也列出了一些错误的相关原因 权限被拒绝(公钥)

The authenticity of host 'gitlab.rsdx.com (132.59.10.87)' can't be established.

为多台Git服务器配置多个 SSH 私钥

比如自己的git服务,公司里存在多个git服务,需要配置多个ssh 公钥在自己的主机电脑上

//生成公司项目使用的 ssh
ssh-keygen -t ed25519 -C 'me@company.com' -f ~/.ssh/gitlab
//生成自己项目使用的 ssh 
ssh-keygen -t ed25519 -C 'me@yourself.com' -f ~/.ssh/github

新建 ~/.ssh/config 配置文件

示例文件,两种配置方式 参数名 参数值 ,参数名=参数值

# configuration 1
Host github.com-repo-0
	HostName github.com
	User git
	Port 22


# configuration 2
Host=gitlab.com-repo-1
	Hostname=gitlab.com
	User git
	Port 22 

主要的规则如下:

  1. 每项配置都是参数名 参数值或参数名=参数值的形式,其中参数名不区分大小写,而参数值区分大小写,如上面的参数名HostName和Hostname是同一个参数
  2. 不同主机的配置通过Host参数来区分,一个配置文件里面可以有针对多个Host的配置
  3. 以#开头的是注释,会被忽略
  4. 同一个Host的配置内部,参数名 参数值和参数值=参数名的形式可以混用,如上例#2配置所示
    下面详细展开常见的参数类型。

常见参数类型

  • Host github.com-repo-0 - 存储库的别名。类似昵称,用于标识某个特定的配置,在ssh命令中使用,例如我们想要ssh连接到上例中的#1配置的主机,则在命令行执行如下命令即可:
ssh github.com-repo-0
  • Hostname github.com - 将主机名配置为与别名一起使用。需要ssh连接过去的主机名,一般是IP地址
  • User 登录主机的用户名
  • Port SSH访问主机的端口号,默认是22端口,同上,只有在非默认情况下才需要设置该值
  • IdentityFile=/home/user/.ssh/repo-0_deploy_key - 将私钥分配给别名。IdentityFile 填写对应的私钥的路径

在同一git服务器上配置多个仓库

如果在一台服务器上使用多个仓库,则需要为每个仓库生成专用密钥对。 不能对多个仓库重复使用一个部署密钥。

在服务器的 SSH 配置文件中(通常为 ~/.ssh/config),为每个存储库添加别名条目。 例如:

Host github.com-repo-0
        Hostname github.com
        IdentityFile=/home/user/.ssh/repo-0_deploy_key

Host github.com-repo-1
        Hostname github.com
        IdentityFile=/home/user/.ssh/repo-1_deploy_key

以上两种同一台电脑配置多个SSH密钥在 ~/.ssh/config文件中都可以混用

ssh key的配置是针对每台主机电脑

设置成功后,即可不需要账号密码clone和push代码

注意之后在clone仓库的时候要使用ssh的url,而不是https!

更改 SSH 密钥口令

在创建 SSH 密钥时,您可以根据 ssh-keygen 程序的提示设置一个密钥口令,这个口令可以保护您的私钥安全。然而,这个口令并不是必须的,所以在一些网络教程、甚至服务器密钥初始化中都直接跳过口令设置步骤。

设置 SSH 密钥口令可以更好地保护您的私钥安全。如果您的私钥文件被泄露,那么攻击者就可以使用您的私钥进行身份验证,访问您的远程服务器。如果您设置了密钥口令,那么攻击者就需要知道您的密钥口令才能解密您的私钥,进而访问您的远程服务器。因此,设置 SSH 密钥口令可以在一定程度上缓解攻击者滥用您的私钥进行恶意活动。

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

$ ssh-keygen -p -f ~/.ssh/id_ed25519
> Enter old passphrase: [输入旧密码]
> Key has comment 'your_email@example.com'
> Enter new passphrase (empty for no passphrase): [输入新密码]
> Enter same passphrase again: [重复确认新密码]
> Your identification has been saved with the new passphrase.

使用 ssh-agent 可以避免重复输入私钥密码

ssh-agent 是一个守护进程,它可以管理您的 SSH 私钥,并且自动为您解密私钥。这样,您就不需要每次使用 SSH 命令时都输入私钥口令。但要注意的是 ssh-agent 仅仅将数据保存在内存中,程序重启后历史记录全部丢失,需要重新配置。

要使用 ssh-agent,首先需要启动它。通常,可以在命令行中输入以下命令来启动 ssh-agent:

eval "$(ssh-agent -s)"

启动 ssh-agent 之后,您可以使用以下命令将您的 SSH 私钥添加到 ssh-agent 中:

ssh-add ~/.ssh/id_ed25519

您可以将多个私钥添加到 ssh-agent 中,这样就可以使用不同的私钥访问不同的远程服务器。