常见的代码托管平台GitHub、GitLab和BitBucket等,基本都会使用Git作为版本控制工具。平台一般都提供两种认证方式https和ssh。了解该过程能够更加自由的配置和使用,本文就来简单聊一下这两种认证方式。

1.HTTPS与SSH

Git可以使用四种协议来传输数据:本地协议(Local),git 协议,HTTPs 协议和SSH(Secure Shell)协议。对于多人远程协作,多用后两者。

超文本传输协议http运行于网络应用层,是应用层通信协议,使用下层的TCP协议进行传输控制。

位于不同网络终端的两个应用进程之间可以通过http进行通信,典型的应用场景是浏览器和网站服务器,是一种C/S Model.

Https可以看做是http+ssl,ssl协议位于网络应用层和传输层之间,主要为应用层提供加密服务,https即为http协议使用ssl协议加密传输数据。

SSH为Secure Shell 的缩写,即安全外壳协议。SSH 为建立在应用层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。

常说的ssh client如OpenSSH等只是SSH协议的一种程序实现,也就是ssh client程序支持SSH协议相关标准。

对于code repo的管理,显然是需要加密进行身份认证的。

2.https和ssh原理

2.1 https原理

https方式clone一个repo或者pull和push到远端只需要根据提示提供自己的username和password即可。

这种方式比价的简便和便于理解,使用自己在平台的账号和密码进行授权并进行repo相关操作。

账号密码以及后续repo相关的传输均使用ssl加密。ssl加密解密的过程完全透明。

ssl认证需要首先验证服务器有有效的证书,对服务器的认证是通过非对称秘钥的方式,该非对称秘钥由第三方公证机构CA提供。

然后通过该非对称密钥对和服务器私密的协商后续数据传输使用的加密算法以及用于生成对称秘钥的一些随机数据。

ssl握手协议结束后会产生只有client和server知道的对称加密秘钥,而该秘钥也用后续所有传输数据的加密。详细过程可以参考相关资料。

即两步:

  1. username&pwd验证对repo的操作权限 ;
  2. ssl对传输数据进行加密(server身份验证和加密解密过程完全透明);

实际操作只需要用到第一步,window和一些第三方git client可以支持永久保存自己的账号和密码。

Windows查看保存的账号信息:

Win键 ->搜索credential ->管理Windows 凭据 -> 普通凭据(or 控制面板 -> 用户账户 -> 管理Windows 凭据 -> 普通凭据)

2.2 ssh原理

https实际操作有一步,但是操作权限验证和传输加密是分开的。

ssh不仅可以压缩和加密传输数据还可以进行身份授权验证。

ssh方式使用非对称加密所需的key-pairs完成身份验证和传输数据加密,git client和server分别需要持有非对称秘钥对中的一个。

出于安全和保密考虑,通常由用户使用秘钥生成工具生成RSA密钥对,并将其中的public key添加到服务端,自己保留private key。

ssh client使用private key向服务端证明自己的身份。

ssh 看起来似乎更加的安全方便,因为它将身份验证和账户密码分离开来,可以单独使用秘钥来进行代码库的操作。

但是使用ssh的初始步骤可能有点麻烦,这个后面介绍。

此外,private key由文件保存,存在丢失的风险,对private key进行密码保护,需要每次使用的时候都输入密码。

不管是git bash还是其他的git client都可以直接使用https,但是使用ssh需要单独的ssh client。

The only requirement is to have the OpenSSH client installed on your system. This comes pre-installed on GNU/Linux and macOS, but not on Windows

并自己生成和管理秘钥对,而且对于非默认路径下rsa密钥对,需要额外相对复杂的处理。

2.3 比较

https方式使用账号和密码授权,简单易用,便于进行权限细分管理,而且防火墙一般会打开 http 和https协议的端口号80 和 443。可以进行匿名访问,对于开源项目,其他人即使没有任何权限也可以方便进行除提交之外的克隆和读取操作。但是可能需要每个项目成员都有一个代码托管平台的账号,而且缺乏凭证管理的话,可能要频繁的进行账号密码输入。

ssh方式单独使用非对称的秘钥进行认证和加密传输,和账号密码分离开来,不需要账号也可以访问repo。生成和管理秘钥有点繁琐,需要管理员添加成员的public key。不能进行匿名访问,ssh不利于对权限进行细分,用户必须具有通过SSH协议访问你主机的权限,才能进行下一步操作,比较适合内部项目。

总的来说,https方便快捷,ssh的使用更加灵活。

3. 配置SSH

如果git使用ssh协议,初始化设置需要三步:

  1. 使用秘钥生成工具(ssh-keygen、puttygen等)生成rsa秘钥;
  2. 将rsa公钥添加到代码托管平台;
  3. 将rsa秘钥添加到ssh-agent中,为ssh client指定使用的秘钥文件;

操作无误后,然后便可以使用ssh方式操作repo。

对于在默认路径~/.ssh/id_rsa下生成的id_rsa密钥对,任何ssh client是可以直接读取到。可以忽略上面的最后一步以及下面将要介绍的内容。

对于第二步,可以参照一下具体网站的操作,对于github和gitlab,可以在settings中ssh key相关的界面添加保存公钥。

下面主要介绍一下第一步和最后一步自定义秘钥对生成路径的情况。

3.1 生成SSH秘钥

生成ssh key pairs的工具有很多:

  • Git Bash提供的仿真环境,可以使用部分linux命令;
  • Git GUI自带的生成方式;
  • PuttyGen 提供可视化的生成过程;
  • Cygwin提供的众多工具;

等等。git bash生成方式较为灵活,下面以这个为例来介绍。

Git Bash下直接使用ssh-keygen命令需要指定秘钥生成路径和保护密码。下面是一种新的更为安全的ssh秘钥生成方式:

ssh-keygen -o -t rsa -b  -C "your_email@163.com" -f ~/.ssh/new_dir/id_rsa

生成过程中设置的passphrase主要是为了防止别人盗用你的秘钥文件,如果设置有保护密码,首次添加id_rsa会要求输入保护密码用以证明秘钥是你的。

查看rsa秘钥fingerprints信息(standard SHA256 Key output):

ssh-keygen -lf ~/.ssh/new_dir/id_rsa.pub
(output) 4096 SHA256:myo......xac your_email@.com (RSA)

Old MD5 Format:

$ ssh-keygen -E md5 -lf ~/.ssh/new_dir/id_rsa.pub
(output) 4096 MD5:ba:......fb:8e your_email@.com (RSA)

3.2 Git Bash

官网上下载的git安装完成后会有git bash和git gui可以使用,分别对应于git client命令行和可视化图形界面。

git bash环境可以支持部分linux命令,其中ssh client默认使用的是OpenSSH.

$ ssh -V
OpenSSH_7.7p1, OpenSSL 1.0.2o Mar

ssh client运行时会默认使用~/.ssh/id_rsa,假设该秘钥存在的情况下。对于非默认路径下的秘钥,需要为ssh client指定。

OpenSSH

OpenSSH的参数来源主要是通过ssh_config(OpenSSH SSH client configuration files)
对于Openssh配置方式以及优先级低到高依次为:

  1. etc/ssh/ssh_config ,# (system-wide file)
  2. ~/.ssh/config,     # (user-specific file)
  3. 命令行配置           # (command line options)

ssh_config文件的基本结构是:keyword arguments(参数名 参数值),#为行注释符,具体细节可以参考 man 5 ssh_config。

实际可以使用其中的任何一个设定ssh client,下面分别介绍这三种方式,这里我们只关注非默认路径下秘钥文件的指定操作。

a). ssh_config

在Windows中安装完git for windows之后,Git安装目录/etc/ssh/ssh_config找到ssh_config,该文件的大部分配置默认均被注释掉了。

通过添加下面的内容进行自定义秘钥的指定:

Host github.com
Preferredauthentications publickey
IdentityFile ~/.ssh/github/id_rsa
Host gitlab.com
Preferredauthentications publickey
IdentityFile ~/.ssh/gitlab/id_rsa

 b). config

~/.ssh/目录下是没有config文件的,需要自己添加,内容和上面的ssh_config一样。

 c). command line

eval $(ssh-agent -s)
ssh-add ~/.ssh/other_id_rsa

直接运行ssh-add会添加默认的~/.ssh/id_rsa,可以使用指令ssh-add -l查看命令行添加的id_rsa.

命令行相对于另外两种配置方式,每次打开git bash都需要进行重新添加,比较麻烦。

用上面任何一种方式添加指定的秘钥,测试添加成功与否可以使用下面的命令:

$ ssh -T git@github.com
or
$ ssh -T git@gitlab.com

认证成功和失败分别返回:

Welcome to GitLab, @your username!
git@gitlab.com: Permission denied (publickey).

相比较与命令行,使用ssh config的方式更加方便,而且配置文件也可以被git gui使用。

注意:

  • window平台上~表示的是%userprofile% (e.g. echo %userprofile% ==> C:\Users\username )
  • 上面通过在~/.ssh/config中添加额外的密钥对是针对ssh Client为OpenSSH,每个host下面可以添加多个认证的密钥对,使用SSH认证过程中会依次验证,直到找到正确的秘钥。
  • SSH密钥对设置的保护密码,会在使用秘钥的时候要求输入,主要为了证明秘钥的确是你的。

3.3 SourceTree

SourceTree是一个较为流行git client。会自动保存https方式认证的账户名和密码,可在tools -> options -> authentication中管理。

在sourcetree中使用ssh方式只需要指定使用的ssh client,然后添加对应的ssh密钥即可。

方式一:tools -> options -> general -> ssh client configuration;

方式二:tools -> add ssh key;

第一种方法可以批量添加ssh key,之间使用分号;分开。

ssh client configuration中可以看到已经添加的所有的ssh key,同时这里可以指定特定的ssh client(PuTTY/Plink or OpenSSH )。

由于ssh-agent会在sourcetree启动的时候开启并添加指定的ssh key,因此方式一添加的ssh key,可能要重启sourcetree才能生效。

配置完成后,使用ssh方式clone一个库的时候,sourcetree能够自动识别repository type说明配置是正确的。

4.其他:

1. Git全局设置

首次使用git需要配置一下自己的用户名和邮箱,作为每次提交者的身份,会被记录在提交日志中。

git config --global user.name "your username"
git config --global user.email "your email"

这里设置的全局信息存放在~/.gitconfig中,可以使用git config -l 查看所有全局设置的信息。

2. https方式缓存账号和密码

除了操作系统和第三方工具提供的凭证保存方案,可以参考一下github介绍的一种方式:Caching your GitHub password in Git

还可以通过为git指定凭据管理器的方式缓存凭证:

新建文件~/.git-credentials,内容为:https://{username}:{passwd}@github.com

为~/.gitconfig添加凭据地址:

[credential]
  helper = store

可以通过执行命令$ git config --global credential.helper store来完成。建议使用系统凭据管理器,不推荐这种方式。

3.knows_hosts文件

文件~/.ssh/known_hosts中存放的是所有已经安全连接过的服务器(hosts)的公钥。

Warning: Permanently added 'gitlab.com,35.231.145.151' (ECDSA) to the list of known hosts.

参考:

https://docs.gitlab.com/ee/ssh/

Git认证方式https和ssh的原理及比较的更多相关文章

  1. 【git】git中使用https和ssh协议的区别以及它们的用法

    git可以使用四种主要的协议来传输资料: 本地协议(Local),HTTP 协议,SSH(Secure Shell)协议及 git 协议.其中,本地协议由于目前大都是进行远程开发和共享代码所以一般不常 ...

  2. jenkins之配置git认证方式

    在使用jenkins构建时候需要从git下拉代码,需要配置认证方式 http拉取代码 配置用户名和密码认证 添加认证 设置用户名和密码 git认证 设置私钥认证

  3. git乌龟http/https以及ssh clone的秘钥配置永久免密码登录设置

    1.安装 安装Git 安装TortoiseGit 乌龟客户端 首先下载安装一个git客户端这个就不多说了基本就是next一直到底 安装后首次新建一个项目project在git服务器上 2.配置 1.注 ...

  4. Java 实现 SSH 协议的客户端登录认证方式--转载

    背景 在开篇之前,让我们先对 SSH 协议有个宏观的大致了解,这样更有利于我们对本文的加深了解.首先要提到的就是计算机网络协议,所谓计算机网络协议,简单的说就是定义了一套标准和规则,使得不同计算机之间 ...

  5. http认证方式,工程部分实现

    学习过程中,被boss批评,要求去复习http协议,因此找了相关资料做成一个系列:对于http认证方式不清楚的可以参考我的上一篇文章 http认证方式https://www.cnblogs.com/j ...

  6. Git配置用户信息和SSH免密

    一.配置用户信息 1.查看配置信息 # 查看所有配置 $ git config -l/--list # 查看系统配置 $ git config --system -l/--list # 查看用户配置 ...

  7. git使用ssh密钥和https两种认证方式汇总(转)

    在版本库的SSH方式和HTTPS方式是不同的,具体来说就是url信息的不同,但是,实际的认证机制也是不同的.当建立了本机密钥之后,使用ssh方式实际上是不需要再次认证的,而https则每次需要输入密码 ...

  8. 【jenkins】04.SSH认证方式拉取Git代码

    首先需要会git ssh 我们一般用http的形式拉取代码. ssh的好处就是不用每次输入密码,而且貌似会快丢丢,不知道是不是错觉. 大概需要三个步骤: 一.本地生成密钥对: 二.设置github上的 ...

  9. git中https和SSH

    1.在git中clone项目有两种方式:HTTPS和SSH,它们的区别如下: HTTPS:不管是谁,拿到url随便clone,但是在push的时候需要验证用户名和密码: SSH:clone的项目你必须 ...

随机推荐

  1. BZOJ_3503_[Cqoi2014]和谐矩阵_高斯消元

    BZOJ_3503_[Cqoi2014]和谐矩阵_高斯消元 题意: 我们称一个由0和1组成的矩阵是和谐的,当且仅当每个元素都有偶数个相邻的1.一个元素相邻的元素包括它本身,及他上下左右的4个元素(如果 ...

  2. 后端开发实践——Spring Boot项目模板

    在我的工作中,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施等,这些内容在敏捷开发中通常被称为"第0个迭代"要做的事情.但是,当项目运行了一段时间之后再来反 ...

  3. Python调用ansible API系列(一)获取资产信息

    你想让ansible工作首先就需要设置资产信息,那么我们如何通过使用Python调取Ansible的API来获取资产信息呢? 要提前准备一个hosts文件 获取组或者主机 #!/usr/bin/env ...

  4. len(x) 击败 x.len(),从内置函数看 Python 的设计思想

    内置函数是 Python 的一大特色,用极简的语法实现很多常用的操作. 它们预先定义在内置命名空间中,开箱即用,所见即所得.Python 被公认是一种新手友好型的语言,这种说法能够成立,内置函数在其中 ...

  5. ORM 开发环境之利器:MVC 中间件 FreeSql.AdminLTE

    前言 这是一篇纯技术干货的分享文章,FreeSql 已经基本完成 .NETCore 最方便的 ORM 使命,我们正在筹备生态的建立,比如 ABP 中如何使用 FreeSql 的实现,需要各种各样的扩展 ...

  6. Asp.NetCore轻松学-部署到 Linux 进行托管

    前言 上一篇文章介绍了如何将开发好的 Asp.Net Core 应用程序部署到 IIS,且学习了进程内托管和进程外托管的区别:接下来就要说说应用 Asp.Net Core 的特性(跨平台),将 .Ne ...

  7. 在MySQL中实现Rank高级排名函数【转】

    MySQL中没有Rank排名函数,当我们需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名.尽管如此,可不要小瞧基础而简单的查询语句,我们可以利用其来达到Rank函数一样的高级排名 ...

  8. Python中使用枚举类

    开发中我们经常定义常量, 其实有更好的方法:为这样的枚举类型定义一个class类型,然后,每个常量都是class的一个唯一实例.Python中提供了Enum类来实现这个功能: from enum im ...

  9. 系统的讲解 - PHP 缓存技术

    目录 概述 浏览器缓存 文件缓存 NoSQL缓存 WEB服务器缓存 Opcode缓存 小结 关于缓存的常见问题 概述 缓存已经成了项目中是必不可少的一部分,它是提高性能最好的方式,例如减少网络I/O. ...

  10. vmware P2V迁移域内windows服务器脱域问题

    windows 域服务器采用vmware converter进行物理机转换为虚拟机,需要在完成后进行退域重新加域操作. 否则,有可能会出现服务器在30天后脱域情况.出现脱域情况,可以通过退域加域的方式 ...