1. Why SSH ?
在应用 github 时或者免密登录到近程服务器时,总要应用到 SSH 这个工具来创立密钥并进行连贯,那什么是 SSH 呢,咱们先来看一下它的简略定义:
SSH 是一种加密协议,全称为 Secure Shell,用于平安地近程登录到服务器或其余近程设施上执行命令或传输文件。它提供了一种平安的加密通信机制,使得近程登录和文件传输等操作不会被歹意攻击者窃取或篡改,确保了数据的保密性和完整性。SSH 采纳公钥密码学技术,可能无效地避免被中间人攻打或网络窃听。
举例来说,如果咱们要应用 Github 这种 git 代码托管平台的话,首先本地要生成一个 SSH 私钥 (如 id_rsa)
和 公钥 (如 id_rsa.pub)
,而后将 公钥
填写到 Github 的 SSH Key 治理面板中。当咱们向 Github 推送代码的时候会首先发动身份校验。此时,本地会将用户信息通过 SSH 私钥
执行『签名』操作。当签名信息发送到 Github 的时候,Github 就会应用用户保留在平台上的 公钥
来校验签名信息,应用 私钥
签名信息只能由对应的 公钥
进行校验,因而如果 Github 对签名校验通过,就能够认证以后的用户对代码仓库领有响应的操作权限,之后就能够让用户提交的代码入库了,整体流程如下图:
对于公钥和私钥,是『非对称加密』相干的内容,公钥通常用于 内容加密 或 认证签名 ,是能够在服务器与客户端之间进行流传的;而私钥是用来 解密公钥加密的内容 或 对内容进行签名 用的
综上,SSH 采纳非对称加密的形式来实现客户端与服务器端的认证并建设通信连贯,因而能够被用于客户端与 git 平台之间的认证,以及近程服务器之间的免密认证。
2. 配置单个 Git 账户
首先,咱们来简略温习一下如何配置单个 git 账户。
对于单个 git 账户的场景非常简单,如果咱们是一个萌新开发者,想要往 Github 上上传我的项目(这里咱们仅探讨 SSH 协定的形式),那么首先咱们要在本地装置 OpenSSH 以及 git。
个别 Linux 类操作系统、MacOS 都曾经自带了 ssh 和 git,不须要独自装置。windows 操作系统参考 官网阐明 来开启 OpenSSH,git 则能够间接拜访 官网 进行装置
装置完 git 之后关上终端,咱们先要应用 git
指令为全局设置一个 git 账户和邮箱:
git config --global user.email YourEmailAdress
git config --global user.name YourUserName
这里 git 的用户名和明码跟你的 Github 账号没有强关联,Github 的账号只是你登录平台用的,而这里的 git 用户名和邮箱是用来标记代码是哪个用户写的。
装置完 OpenSSH 之后关上操作系统上的终端(windows 操作系统举荐应用 git bash 或者 cmder),而后来到 ssh 目录下:
cd ~/.ssh
如果首次装置,这个目录外面会没有任何内容,之后咱们执行第一步:生成一对 SSH 密钥
ssh-keygen -t rsa -C "YourEmailAdress"
这个指令的意思是应用 ssh-keygen
生成密钥,-t
参数密钥的加密形式是 rsa
,-C
参数能够为密钥指定备注,通常备注能够为你的邮箱,或者你也能够写成你要连贯的近程服务器名(总之不重要)。
输出实现之后会进入一个交互式终端界面,首先会询问你的密钥文件名称:
Enter file in which to save the key (/Users/username/.ssh/id_rsa):
咱们能够应用回车跳过,那么密钥文件名称就主动生成为 id_加密形式
,如 id_rsa
。
之后会提醒用户输出明码:
Enter passphrase (empty for no passphrase):
这个明码是用来爱护你的私钥的,咱们这里防止麻烦能够间接跳过。
生成实现之后,咱们在终端中应用 cat 指令,输入生成的公钥内容:
cat ~/.ssh/id_rsa.pub
公钥的内容为一串长字符串,字符串的开端为你输出的密钥备注
之后咱们拜访 Github 的用户设置界面,并来到 SSH and GPG keys
面板
点击 New SSH key
,之后将后面输入的公钥内容粘贴到 输入框中:
之后咱们输出 ssh -T git@github.com
如果提醒 You've successfully authenticated
就阐明胜利与 Github 建设了受权链接,你就能够往你的 Github 仓库推送代码了。
3. 配置多个 Git 代码托管平台
作为一个程序员,在工作中,咱们可能须要将代码推送到公司的自建 Git 代码托管平台上(如 GithLab)。然而在生活中,当咱们参加一些集体的开源我的项目,则又须要将代码推送到社区的 Git 代码托管平台上(如 Github 或 Gieet)。
emmm 有点像 Marvel 的超级英雄?
为了应答这个场景,咱们通常有两种解决方案:
3.1 计划一:多个 Git 代码托管平台配置同一个 SSH 公钥
在第一节咱们曾经简略理解了 SSH 公钥的作用,那么咱们能够简略推断出在应用 SSH 创立身份验证连贯的时候,并没有严格限定咱们生成的私钥和公钥只能利用于一个 Git 代码托管平台。
那么咱们只有创立出了一对公私钥,复制公钥内容到多个平台的 SSH Key 治理面板中即可实现对一对公私钥的复用。
当咱们创立 SSH 连贯的时候,git 会应用默认且惟一的一个私钥来对身份信息进行签名,当推送到不通的平台时,因为应用的是同一个公钥,因而能够失常通过身份认证。
3.2 计划二:应用多组密钥并指定给不同的平台
SSH 容许对立个操作系统中存在多对密钥,因而你能够应用 ssh-keygen
指令生成多组密钥,同时将不同的密钥调配给不通的 Git 代码托管平台。
Setp.1 生成密钥
首先,咱们应用 ssh-keygen
生成第一组密钥对,用于提供给 Gtihub 平台应用:
ssh-keygen -t rsa -C "YourPersonalEmailAdress"
# 输出密钥的名称: id_rsa_github
Enter file in which to save the key (/Users/username/.ssh/id_rsa): id_rsa_github
而后,咱们再生成第二组密钥对,用于提供给公司的 Git 代码托管平台(如 Gitlab)应用:
ssh-keygen -t rsa -C "YourCompanyEmailAdress"
# 输出密钥的名称: id_rsa_company
Enter file in which to save the key (/Users/username/.ssh/id_rsa): id_rsa_company
此时,你的 ~/.ssh
目录下会呈现四个文件:
id_rsa_github
id_rsa_github.pub
id_rsa_company
id_rsa_company.pub
而后咱们要把生成的密钥应用 ssh-add
指令增加到 ssh-agent 的身份验证代理中:
ssh-add id_rsa_github
ssh-add id_rsa_company
如果不实用
ssh-add
指令增加新的密钥到 ssh agent 中的话,零碎会依然应用id_rsa
作为默认的 SSH Key,因为id_rsa
是被默认增加到 ssh agent 中的
Step.2 为近程服务器配置密钥
~/.ssh
目录下存在一个 config
文件,如果不存在能够应用 touch config
指令这个文件。
这个文件用于配置 SSH 客户端的信息,例如主机名、端口号、用户名、密钥等,对于 Git 代码托管平台来说,咱们能够通过这个配置为不通的 Git 代码托管平台服务器配置不同的 SSH 密钥。
持续下面的示例,创立 config 文件后,应用 vim 或者其余任意编辑器编辑 config 文件,输出以下内容:
Host github
User git
Hostname github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_github
Host company-git
User git
# 替换为你公司的 Git 代码托管平台的服务器
Hostname company-git-repo.com
# 你公司 SSH 服务的端口号
Port 22
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_company
config 配置文件中的各项配置意思为:
- Host:指定连贯到的主机名,能够随便指定,相当于理论连贯指标主机的别名;
- User:指定应用的用户名,通常为 git,也能够不指定;
- Hostname:指定连贯到的主机的理论域名或 IP 地址。如果是向 Github 推送代码,则为 github.com,如果是向公司的 Git 代码托管平台推送代码,则填写公司主机的地址
- Port:SSH 服务的端口号,默认为 22,能够不写
- PreferredAuthentications:指定优先应用的身份验证办法,指定为 publickey,即应用公钥进行身份认证。
- IdentityFile:指定要应用的私钥文件门路,即指向你创立的私钥,咱们这里别离为不通的 Git 代码托管平台指定了不同的私钥
配置实现后,咱们登录 Github,将 id_rsa_github.pub
的公钥内容复制到 SSH Key 治理面板中;同样的,咱们登录公司的 Git 代码托管平台上,将 id_rsa_company.pub
中的公钥内容复制到对应的治理 SSH Key 的地位(这个地位通常在个人信息设置中,可能被称为『SSH Key 治理』或者『公钥治理』等名称)
这样,当将代码上传到 Github 时,就会主动应用 id_rsa_github
这个密钥对;当将代码上传到公司的 Git 代码托管平台时候,就会主动应用 id_rsa_company
这个密钥对。
Setp.3 配置不同的 git 用户名以及邮箱
除了解决了不同平台应用不通的公私钥问题外,咱们在不通的仓库提交代码时用的用户名和邮箱也可能须要不一样,比方:
- 在 Github 上,我须要用网名来暗藏我的实在身份,因而我提交代码的用户名为
github-user
,邮箱为github-user@github.com
; - 而在工作中,公司则要求我提交代码时的 git 用户名必须为我的实在姓名拼音,邮箱则为公司邮箱。
这些配置就跟 SSH 的配置无关了,这些就须要调整咱们的 git 配置。
首先,咱们在全局配置一个 git 用户名和邮箱,这里我倡议应用你在 Github 上想要应用的用户名和邮箱,毕竟 Github 常驻,而公司不常驻:
git config --global user.email github-user@github.com[更改成你的邮箱]
git config --global user.name github-user[更改成你的网名]
此时,咱们在 git 的配置文件 ~/.gitconfig
中就能够看到如下的配置段,示意曾经配置胜利:
[user]
name = github-user
email = github-user@github.com
当咱们提交代码的时候就会应用这个默认的用户名和邮箱来提交代码了。
除此之外,git 也反对通过在 git 我的项目内增加一个『本地配置』来独自配置每个我的项目的用户名和明码。利用这个能力,当咱们将公司的代码 clone 到本地之后,进入到代码仓库,首先要做的第一件事件就是为这个公司的代码仓库设置独立的 git 用户名和明码。
git config --local user.name zhangsan[改为你的实在姓名]
git config --local user.name zhangsan@company.com[改为你公司的邮箱]
总结,咱们在应用 Github 提交提交代码的时候,无需在我的项目内独自设置 git 用户名和邮箱,因为会主动应用咱们全局设置好的;当咱们在编写公司我的项目的时候,当代码拉下来之后要独自为这个我的项目设置一个用户名和邮箱。
4. 同时配置多个 Github 账号
区别与配置多个多个 Git 代码托管平台,还有一种状况咱们是可能遇到的。如果你是一个 Github 上的开发者,你的电脑上配置好了一个提供给 Github 提交代码应用的密钥对,然而同时你又须要治理一个小号(比方治理一个你女朋友的账号给她的代码仓库提交代码)。
聪慧的你肯定会想到,我再我的小号中增加我当初曾经创立好的专门给 Github 应用的公钥不就能够了吗?想法很不错,是第二节中咱们提到的计划一的思路,然而 Github 不容许在多个账户上应用同一个 SSH Key,当你设置了就会呈现『Key is already in use』的提醒。
那先让咱们仿照 3.2 节中形容的办法如法炮制一下,再生成一个新的 SSH Key,名字就叫做 id_rsa_github_x
:
ssh-keygen -t rsa -C "YourPersonalEmailAdress"
# 输出密钥的名称: id_rsa_company
Enter file in which to save the key (/Users/username/.ssh/id_rsa): id_rsa_github_x
咱们把小号的公钥增加到 Github 的 SSH Key 面板中后,在 SSH config 文件中追加上:
# github 主账号的配置
Host github
User git
Hostname github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_github
# github 新账号的配置
Host github_x
User git
Hostname github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_github_x
这个时候,你从小号的 Github 中 clone 下来一个仓库,假如地址为 git@github.com:user_x/blog.git
,那么就在终端中输出:
git clone git@github.com:user_x/blog.git
而后 commit 一些代码后,执行 push 操作时,就会发现出错啦:
ERROR: Permission to user_x/blog.git denied to xxx.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
这个意思就是阐明你没有权限向这个仓库中提交代码,也就是说 SSH 受权出问题了。
实际上,在你应用 git push
提交代码的时候,因为你的代码的仓库源在 Github 上,因而 SSH 连贯的主机就是 github.com
,然而当 SSH 发动连贯的时候,它会发现你的 SSH config 文件中配置了两段 Hostname
都为 github.com
的配置,那么 SSH 会优先应用第一段配置中的公钥向 Github 建设身份认证连贯。那么当身份认证申请达到 Github 的时候,Github 拿出公钥进行身份认证签名比照后发现你不是你的小号,那么天然就会回绝你的提交代码的申请。
那么,如何让发动申请的时候,应用咱们小号的私钥呢?咱们先来看一下执行 clone 代码时候,仓库源那个以 git
结尾的链接是什么意思:
分明了以上各个局部代表的意思后,咱们能够利用 SSH 建设连贯的一个个性:指标服务器能够间接写成为服务器地址,同时也能够写为咱们在 SSH config 文件中配置的 Host
,也就是服务器的别名。
因而咱们能够将仓库的源改为 git@github_x:user_x/blog.git
:
git remote set-url origin git@github_x:user_x/blog.git
此外别忘了咱们必须应用 ssh-add
指令将生成的 SSH key 增加到 ssh-agent 的身份验证代理中:
ssh-add ~/.ssh/id_rsa_github_x
否则建设 SSH 连贯时,会应用 id_rsa_github 的密钥对,你始终无奈失去正确的身份辨认!
而后咱们来测试一下连贯:
ssh -T git@github_x
# 输入如下内容就阐明身份认证通过了!Hi user_x[你小号的用户名]! You've successfully authenticated, but GitHub does not provide shell access.
如果输入的用户名是你的小号,那就阐明能够失常在方才的那个仓库里推送代码了。
再来测试一下主账号的连贯是否失常:
ssh -T git@github.com
# 输入如下内容就阐明身份认证通过了!Hi user[你主账号的用户名]! You've successfully authenticated, but GitHub does not provide shell access.
如果输入的用户名是你的主账号用户名,就阐明原有的 Github 连贯并没有受到影响,之前的仓库仍旧能够失常推送代码。
You've successfully authenticated, but GitHub does not provide shell access.
这个正告无需理睬,只是在揭示你 github 不容许 shell 交互(比方像应用 ssh 连贯一台近程主机那样)而已。
尔后,clone 小号的代码仓库时候也要记得将近程源的『指标服务器』字段改写为你在 ssh config 中编写的 Host 别名,这样才不会与你 Github 主账号的连贯抵触。主账号则依然应用 github.com
作为指标服务器地址即可。