常見的代碼託管平臺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/