生成密钥
ssh-keygen -t rsa -C "gitlab 用户邮箱地址" ←┘
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/user/.ssh/id_rsa): ←┘
Enter passphrase (empty for no passphrase): ←┘
Enter same passphrase again: ←┘
...
github 密钥
ssh-keygen -t rsa -C "github 用户邮箱地址" ←┘
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/user/.ssh/id_rsa): id_rsa_github ←┘
Enter passphrase (empty for no passphrase): ←┘
Enter same passphrase again: ←┘
...
~/.ssh/ 目录下生成以下文件:
- id_rsa
- id_rsa.pub
- id_rsa_github
- id_rsa_github.pub
分别将 id_rsa.pub 和 id_rsa_github.pub 内容复制到 gitlab 或 github 的 ssh key 中
添加 config 文件
# gitlab
Host gitlab
HostName gitlab.com
IdentityFile ~/.ssh/id_rsa
# github
Host github
HostName github.com
IdentityFile ~/.ssh/id_rsa_github
测试连接
gitlab
ssh -T git@gitlab.com ←┘
The authenticity of host 'gitlab.com (52.167.219.168)' can't be established.
ECDSA key fingerprint is SHA256:HbW3g8zUjNSksFbqTiUWPWg2Bq1x8xdGUrliXFzSnUw.
Are you sure you want to continue connecting (yes/no)? yes ←┘
...
Welcome to GitLab, username!
github
ssh -T git@github.com ←┘
The authenticity of host 'github.com (52.167.219.168)' can't be established.
ECDSA key fingerprint is SHA256:HbW3g8zUjNSksFbqTiUWPWg2Bq1x8xdGUrliXFzSnUw.
Are you sure you want to continue connecting (yes/no)? yes ←┘
...
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
会在 ~/.ssh/ 目录下自动生成 known_hosts 文件
测试连接失败,Permission denied (publickey).
原因是,我们自定义了 id_rsa_github 钥匙名,默认情况下,连接会搜索 id_rsa 钥匙名,所以这里会失败
可以通过 ssh -T -v git@github.com 了解连接失败的具体原因
ssh-agent
# 开启 agent
eval $(ssh-agent -s) ←┘
Agent pid 8428
# 添加 钥匙名
ssh-add ~/.ssh/id_rsa_github ←┘
Identity added: /c/Users/user/.ssh/id_rsa_github (/c/Users/user/.ssh/id_rsa_github)
# 查看 agent list
ssh-add -l ←┘
8428 SHA256:A9UcJMadwTpF7TvsT5LEXsSssTs5qehmV9Q2Q8Ntw3o /c/Users/user/.ssh/id_rsa_github (RSA)
# 不用时可以关闭 agent
eval $(ssh-agent -k) ←┘
Agent pid 8428 killed
注意:使用github时,记得在自己的项目下定义 local user.name 和 local user.email
git config --local user.name ''
git config --local user.email ''
该文件的主要作用就是指明各个 git 帐号对应的 User 以及 IdentityFile 的文件位置。当配置完毕后,在各个项目 repo 中应用自己的用户名以及邮箱:
1.取消 global
git config --global --unset user.name
git config --global --unset user.email
2.设置每个项目 repo 的自己的 user.email
git config user.email "xxxx@xx.com"
git config user.name "ddfe"
如果没有~/.ssh/ 目录
尝试用 “ssh -vT git@git.xiaojukeji.com” 去查看 ssh 连接主机的 debug 信息,可能会生成该目录
总结:
使用命令 “ssh -vT git@xxx.com” 查看 ssh_config 文件的位置
进入 ssh_config 文件,配置各个 git 帐号的 User 以及 IdentityFIle
在各个项目中配置好 user.name 以及 user.email
在各个 git 帐号间尽情穿梭吧~
git 的 ssh 配置文件的位置不一定是 ~/.ssh/ssh_config,具体位置还是需要通过上面总结中的第一点进行查看。如果是 ssh 登录云主机的操作,配置文件的位置则可能是以下情况:
用户配置文件 (~/.ssh/config)
系统配置文件 (/etc/ssh/ssh_config)
git仓库克隆项目时HTTPS跟SSH区别
这两种方式的主要区别在于:
使用https url克隆对初学者来说会比较方便,复制https url然后到git Bash里面直接用clone命令克隆到本地
但是每次fetch和push代码都需要输入账号和密码,这也是https方式的麻烦之处。
而使用SSH url克隆却需要在克隆之前先配置和添加好SSH key,因此,如果你想要使用SSH url克隆的话,你必须是这个项目的拥有者。
否则你无法添加SSH key,另外ssh默认每次fetch和push代码不需要输入账号和密码,如果你想要每次都输入账号密码才能进行fetch和push也可以另外进行设置。
ssh-keygen命令解释
ssh-keygen -t rsa -C “youremail.com”
在用Git生成密钥的时候,查询到的命令是:
ssh-keygen -t rsa -C "邮件地址@youremail.com"
和
ssh-keygen -t rsa -b 4096 -C "邮件地址@youremail.com"
ssh
SSH 为Secure Shell 的缩写,SSH 为建立在应用层基础上的安全协议。
SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。
利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。
ssh-keygen
从客户端来看,SSH提供两种级别的安全验证:
第一种级别(基于口令的安全验证):只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。
第二种级别(基于密钥的安全验证)ssh-keygen:需要依靠密钥,这里的密钥是非对称密钥。
t : t是type的缩写
-t即指定密钥的类型,密钥的类型有两种,一种是RSA,一种是DSA
RSA和DSA
RSA:RSA加密算法是一种非对称加密算法,是由三个麻省理工的牛人弄出来的,RSA是他们三个人姓的开头首字母组合。
DSA:Digital Signature Algorithm (DSA)是Schnorr和ElGamal签名算法的变种。
为了让两个linux机器之间使用ssh不需要用户名和密码。所以采用了数字签名RSA或者DSA来完成这个操作。
ssh-keygen默认使用rsa密钥,所以不加-t rsa也行,如果你想生成dsa密钥,就需要加参数-t dsa。
b :b是bit的缩写
-b 指定密钥长度。
4096
对于RSA密钥,最小要求768位,默认是2048位。4096指的是RSA密钥长度为4096位。
DSA密钥必须恰好是1024位(FIPS 186-2 标准的要求)。
C:comment的缩写
-C表示提供一个注释,用于识别这个密钥。 可以省略.
“邮件地址@youremail.com”:用于识别这个密钥的注释内容
引号里的内容为注释的内容,所以"双引号里面不一定得填邮箱,可以输入任何内容。
SSH密钥的类型以及可供选择的密钥
GitLab支持RSA,DSA,ECDSA和ED25519密钥。它们的区别在于签名算法,其中一些具有其他优势。有关更多信息,您可以在ArchWiki上阅读这篇 不错的文章。在这里,我们将重点介绍ED25519和RSA。
注意:注意: 作为管理员,您可以限制应允许的键及其最小长度。默认情况下,允许所有密钥,GitLab.com也是如此 。
ED25519 SSH密钥
按照最佳做法,您应该始终喜欢ED25519 SSH密钥,因为它们比其他类型更安全并且具有更好的性能。
ED25519 SSH密钥是OpenSSH 6.5中引入的,因此任何现代操作系统都应包括创建它们的选项。如果由于任何原因您与之交互的OS或GitLab实例不支持ED25519,则可以回退到RSA。
注意:注意: Omnibus不随OpenSSH一起提供,因此它使用您的GitLab服务器上的版本。如果使用Omnibus,如果要使用ED25519 SSH密钥,请确保已安装的OpenSSH版本是6.5版或更高版本。
RSA SSH密钥
RSA密钥是最常见的密钥,因此与可能具有旧OpenSSH版本的服务器最兼容。如果GitLab服务器不适用于ED25519键,请使用它们。
最小密钥大小为1024位,默认为2048。如果希望生成更强的RSA密钥对,请使用-b
比默认值高的位值指定标志。