前言

一直很困惑 SSH 和 HTTPS 之间的关系。

两者都对传输信息的过程进行了加密、解密操作,都使用到了非对称加密(RSA),点我查看 DES、AES、RSA 的区别

但不同的地方更多,SSH(Secure Shell) 是为远程登录,远程通信等设计的安全通信协议;而 HTTPS 采用的是 SSL(Secure Sockets Layer 安全套接层)协议或者其继任者TLS(Transport Layer Security传输层安全)协议。两者完全不同,详情点击我查看 - SSH原理

使用过 git 的童鞋应该都知道,连接使用 git 服务器有两种方式,一种是 SSH,另外一种就是 HTTP[S]。相对操作来说,HTTP[S] 方式使用更简明一些,输入账号密码,上传或下载代码。而 SSH 方式需要本地生成 RSA 的公钥、私钥,并将公钥上传到 git 服务器,之后本地与服务器连接就可以省去账号密码验证。使用过程中发现,HTTP[S] 方式每次 push 代码到服务器 或者 merge 代码到本地库都需要输入账号、密码,这对于开发项目来说很麻烦。

那么有没有一种方法是可以跳过输入密码这个过程的呢?

免密登录配置

SSH 方式

如前面所说,在配置完成 SSH 后,本地与 git 服务器通信是不需要输入账号、密码的。

具体配置 SSH 操作如下(本地 shell 使用 git-bash):

1.快速确认是否已经拥有密钥

$ 为 git-bash shell 环境自带的 bash 前缀,不属于指令的一部分。

$ ls ~/.ssh/
id_rsa  id_rsa.pub  known_hosts

如果已存在 id_rsa 和 id_rsa.pub (默认名称)文件,则说明你之前已经配置生成过密钥了。

$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAA...
...
...+Rth jasonli@seasidecrab.com

使用 catless 查看 .pub 结尾的公钥文件,看末尾的邮箱地址是否是你自己的。

如果不是你的邮箱,说明不是你自己生成的,你就需要重新生成密钥了。

2.生成密钥文件

如果是本地生成过密钥文件,可以跳过这一步。

ssh 生成 rsa 类型的 SSH key

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

# 代码参数含义: 
# -t指定密钥类型,默认是rsa,可以省略。 
# -C设置注释文字,比如邮箱。 
# -f指定密钥文件存储文件名。

首先 ssh-keygen 会确认密钥的存储位置和文件名(默认是 .ssh/id_rsa),然后他会要求你输入两次密钥口令,留空即可。所以一般选用默认,全部回车即可。

3.上传公钥文件内容

接下来我们登陆到 git 服务器上传公钥文件了。

以 Github 为例,右上角小头像 -> Setting-> SSH and GPG keys 中,点击 new SSH key。

Title 可以随便填写,但最好起的名字能让自己知道这个公钥是哪个设备的。Key 将上面生成的.pub文件中的所有内容(也就是上面的 cat 指令查看公钥文件输出的全部内容)复制到这里。点击下面的 Add SSH key 提交即可。

4.测试使用 git clone 或者 git push 操作代码

以上配置已经完成,接下来就是测试是否可以使用 SSH 免密登录了。

可以使用 git clone 去 fetch git 服务器上的代码,地址选择 SSH 方式的地址。

如果 git 服务器上没有 repo(版本库),可以新创建一个版本库(不勾选自动生成 READEME.md),然后版本库页面上会有指令提示,按照 git init 的那一套指令往下走就可以了。

HTTP[S] 方式

HTTP[S] 方式也是可以实现免密登录的,这需要额外将你的账号密码保存到本地的 git 身份校验文件中。

具体配置 HTTP[S] 免密登录操作如下(本地 shell 使用 git-bash):

1.查看 git 的身份校验文件 .git-credentials

$ cat ~/.git-credentials
...
http://username:password@xx.xx.xx.xx
...

若没有这个文件,使用 touch ~/.git-credentials 新建一个。

具体格式:http[s]://用户名:密码@服务器地址

就是在你正常的 HTTP[S] 方式的 git 服务器地址内拼接上你的用户名和密码(明文存储)。

2.在 git 校验文件中添加拼接后的 HTTP[S] 方式的服务器地址

一条一行即可。

3.添加 git 配置项,使能身份校验

$ git config --global credential.helper store

查看 ~/.gitconfig 文件变化(git 配置项是否修改成功)

[credential]
    helper = store

4.测试使用 HTTP[S] 方式的免密登录

过程与 SSH 的步骤 4 基本一致,注意 fetch 和 push 的地址要改成 HTTP[S] 方式的服务器地址。

文章参考:Git之SSH与HTTPS免密码配置 - 简书