常见的代码托管平台GitHub、GitLab和BitBucket等,基本都会使用Git做为版本控制工具。平台通常都提供两种认证方式https和ssh。了解该过程可以更加自由的配置和使用,本文就来简单聊一下这两种认证方式。linux
Git可使用四种协议来传输数据:本地协议(Local),git 协议,HTTPs 协议和SSH(Secure Shell)协议。对于多人远程协做,多用后二者。git
超文本传输协议http运行于网络应用层,是应用层通讯协议,使用下层的TCP协议进行传输控制。github
位于不一样网络终端的两个应用进程之间能够经过http进行通讯,典型的应用场景是浏览器和网站服务器,是一种C/S Model.算法
Https能够看作是http+ssl,ssl协议位于网络应用层和传输层之间,主要为应用层提供加密服务,https即为http协议使用ssl协议加密传输数据。windows
SSH为Secure Shell 的缩写,即安全外壳协议。SSH 为创建在应用层基础上的安全协议。SSH 是目前较可靠,专为远程登陆会话和其余网络服务提供安全性的协议。浏览器
常说的ssh client如OpenSSH等只是SSH协议的一种程序实现,也就是ssh client程序支持SSH协议相关标准。缓存
对于code repo的管理,显然是须要加密进行身份认证的。安全
https方式clone一个repo或者pull和push到远端只须要根据提示提供本身的username和password便可。bash
这种方式比价的简便和便于理解,使用本身在平台的帐号和密码进行受权并进行repo相关操做。服务器
帐号密码以及后续repo相关的传输均使用ssl加密。ssl加密解密的过程彻底透明。
ssl认证须要首先验证服务器有有效的证书,对服务器的认证是经过非对称秘钥的方式,该非对称秘钥由第三方公证机构CA提供。
而后经过该非对称密钥对和服务器私密的协商后续数据传输使用的加密算法以及用于生成对称秘钥的一些随机数据。
ssl握手协议结束后会产生只有client和server知道的对称加密秘钥,而该秘钥也用后续全部传输数据的加密。详细过程能够参考相关资料。
即两步:
实际操做只须要用到第一步,window和一些第三方git client能够支持永久保存本身的帐号和密码。
Windows查看保存的帐号信息:
Win键 ->搜索credential ->管理Windows 凭据 -> 普通凭据(or 控制面板 -> 用户帐户 -> 管理Windows 凭据 -> 普通凭据)
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密钥对,须要额外相对复杂的处理。
https方式使用帐号和密码受权,简单易用,便于进行权限细分管理,并且防火墙通常会打开 http 和https协议的端口号80 和 443。能够进行匿名访问,对于开源项目,其余人即便没有任何权限也能够方便进行除提交以外的克隆和读取操做。可是可能须要每一个项目成员都有一个代码托管平台的帐号,并且缺少凭证管理的话,可能要频繁的进行帐号密码输入。
ssh方式单独使用非对称的秘钥进行认证和加密传输,和帐号密码分离开来,不须要帐号也能够访问repo。生成和管理秘钥有点繁琐,须要管理员添加成员的public key。不能进行匿名访问,ssh不利于对权限进行细分,用户必须具备经过SSH协议访问你主机的权限,才能进行下一步操做,比较适合内部项目。
总的来讲,https方便快捷,ssh的使用更加灵活。
若是git使用ssh协议,初始化设置须要三步:
操做无误后,而后即可以使用ssh方式操做repo。
对于在默认路径~/.ssh/id_rsa下生成的id_rsa密钥对,任何ssh client是能够直接读取到。能够忽略上面的最后一步以及下面将要介绍的内容。
对于第二步,能够参照一下具体网站的操做,对于github和gitlab,能够在settings中ssh key相关的界面添加保存公钥。
下面主要介绍一下第一步和最后一步自定义秘钥对生成路径的状况。
生成ssh key pairs的工具备不少:
等等。git bash生成方式较为灵活,下面以这个为例来介绍。
Git Bash下直接使用ssh-keygen命令须要指定秘钥生成路径和保护密码。下面是一种新的更为安全的ssh秘钥生成方式:
ssh-keygen -o -t rsa -b 4096 -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@163.com (RSA)
Old MD5 Format:
$ ssh-keygen -E md5 -lf ~/.ssh/new_dir/id_rsa.pub (output) 4096 MD5:ba:......fb:8e your_email@163.com (RSA)
官网上下载的git安装完成后会有git bash和git gui可使用,分别对应于git client命令行和可视化图形界面。
git bash环境能够支持部分linux命令,其中ssh client默认使用的是OpenSSH.
$ ssh -V OpenSSH_7.7p1, OpenSSL 1.0.2o 27 Mar 2018
ssh client运行时会默认使用~/.ssh/id_rsa,假设该秘钥存在的状况下。对于非默认路径下的秘钥,须要为ssh client指定。
OpenSSH
OpenSSH的参数来源主要是经过ssh_config(OpenSSH SSH client configuration files)
对于Openssh配置方式以及优先级低到高依次为:
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使用。
注意:
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说明配置是正确的。
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添加凭据地址:
能够经过执行命令$ 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/