文章目录
- 前言
- 配置SSH
- 第一步:检查本地主机是否已经存在ssh key
- 第二步:生成ssh key
- 第三步:获取ssh key公钥内容(id_rsa.pub)
- 第四步:Github账号上添加公钥
- 第五步:验证是否设置成功
- 为什么使用SSH就可以不需要用户名和密码了呢?
- 一些细节问题解释
前言
在 github上配置ssh key很容易,但网上一大堆教程,基本没解释其原理的(配了后下次需要配又忘记步骤),也没有具体操作结果截图?对一些细节问题也没有说清楚。
- 比如为什么每一台电脑都要配?(这个电脑就是你要放代码的机器)
- 配了为啥就不用密码了?
为什么要使用SSH
我们在往github上push项目的时候,如果走https的方式,每次都需要输入账号密码,非常麻烦。而采用ssh的方式,就不再需要输入,只需要在github自己账号下配置一个ssh key即可。
另外Github对于用户名和密码的方式已经弃用了,如下图所示:

你如果想clone一个工程还必须通过SSH配置公私钥的方式。
配置SSH的步骤
git使用SSH配置, 初始需要以下三个步骤
- 使用秘钥生成工具生成rsa秘钥和公钥(秘钥生成工具就是
ssh-keygen
,在你本机生成即可) - 将rsa公钥添加到代码托管平台
- 将rsa秘钥添加到ssh-agent中,为ssh client指定使用的秘钥文件
具体操作如下:
第一步:检查本地主机是否已经存在ssh key
cd ~/.ssh ls
//看是否存在 id_rsa 和 id_rsa.pub文件,如果存在,说明已经有SSH Key
如下图所示,则表明已经存在

如果存在,直接跳到第三步
第二步:生成ssh key
如果不存在ssh key,使用如下命令生成
ssh-keygen -t rsa -C "xxx@xxx.com"
//执行后一直回车即可
生成完以后再用第二步命令,查看ssh key
第三步:获取ssh key公钥内容(id_rsa.pub)
如下图所示,复制该内容

第四步:Github账号上添加公钥
进入Settings设置

添加ssh key,把刚才复制的内容粘贴上去保存即可

第五步:验证是否设置成功
显示如下信息表明设置成功

设置成功后,即可不需要账号密码clone和push代码
第六步:克隆代码
注意之后在clone仓库的时候要使用ssh的url,而不是https!


为什么使用SSH就可以不需要用户名和密码了呢?
SSH登录安全性由非对称加密保证,产生密钥时,一次产生两个密钥,一个公钥,一个私钥,在git中一般命名为id_rsa.pub, id_rsa。
那么如何使用生成的一个私钥一个公钥进行验证呢?
准备:本地生成一个密钥对,其中公钥放到远程主机,私钥保存在本地
- 当本地主机需要登录远程主机时,本地主机向远程主机发送一个登录请求
- 远程收到消息后,随机生成一个字符串并用公钥加密,发回给本地。
- 本地拿到该字符串,用存放在本地的私钥进行解密
- 再次发送到远程,远程比对该解密后的字符串与源字符串是否等同,如果等同则认证成功。
具体流程图如下所示:

一些细节问题解释:
(1)配了后可以有哪些方便? 配了后clone和push代码的时候不需要反复输入自己的github账号密码,更方便(另外github现在不支持用户名和密码方式) (2)每使用一台主机都要配? 每一台都需要配,每使用一台新主机进行git远程操作,想要实现无密,都需要配置(按照上面"配置SSH的步骤"命令执行)。
具体原理可以看下图,公私钥是配对的,每台本地机器都有自己私钥,解密的时候都用自己的私钥:

(3)配了为啥就不用密码了? 因为配置的时候是把当前主机的公钥放到了你的github账号下,相当于当前主机和你的账号做了一个关联,你在这台主机上已经登录了你的账号,此时此刻github认为是该账号主人在操作这台主机,在配置ssh后就信任该主机了。所以下次在使用git的时候即使没有登录github,也能直接从本地push代码到远程了。
当然这里不要混淆了,你不能随意push你的代码到任何仓库,你只能push到你自己的仓库或者其他你有权限的仓库!