論git中使用https和ssh協議的區別
SHELDON CUI'S BLOG
2017-09-08
http好還是ssh好?
git可以使用四種主要的協議來傳輸資料: 本地協議(Local),HTTP 協議,SSH(Secure Shell)協議及 git 協議。其中,本地協議由於目前大都是進行遠程開發和共享代碼所以一般不常用,而git協議由於缺乏授權機制且較難架設所以也不常用。
最常用的便是SSH和HTTP(S)協議。git關聯遠程倉庫可以使用http協議或者ssh協議。
HTTPS優缺點
-
優點1: 相比 SSH 協議,可以使用用戶名/密碼授權是一個很大的優勢,這樣用戶就不必須在使用 Git 之前先在本地生成 SSH 密鑰對再把公鑰上傳到服務器。 對非資深的使用者,或者系統上缺少 SSH 相關程序的使用者,HTTP 協議的可用性是主要的優勢。 與 SSH 協議類似,HTTP 協議也非常快和高效
-
優點2: 企業防火牆一般會打開 80 和 443 這兩個常見的http和https協議的端口,使用http和https的協議在架設了防火牆的企業裏面就可以繞過安全限制正常使用git,非常方便
-
缺點: 使用http/https除了速度慢以外,還有個最大的麻煩是每次推送都必須輸入口令. 但是現在操作系統或者其他git工具都提供了
keychain
的功能,可以把你的賬戶密碼記錄在系統裏,例如OSX 的 Keychain 或者 Windows 的憑證管理器。
SSH的優缺點
- 優點1: 架設 Git 服務器時常用 SSH 協議作爲傳輸協議。 因爲大多數環境下已經支持通過 SSH 訪問 —— 即時沒有也比較很容易架設。 SSH 協議也是一個驗證授權的網絡協議;並且,因爲其普遍性,架設和使用都很容易。
-
缺點1: SSH服務端一般使用22端口,企業防火牆可能沒有打開這個端口。
-
缺點2: SSH 協議的缺點在於你不能通過他實現匿名訪問。 即便只要讀取數據,使用者也要有通過 SSH 訪問你的主機的權限,這使得 SSH 協議不利於開源的項目。 如果你只在公司網絡使用,SSH 協議可能是你唯一要用到的協議。 如果你要同時提供匿名只讀訪問和 SSH 協議,那麼你除了爲自己推送架設 SSH 服務以外,還得架設一個可以讓其他人訪問的服務。
總結
HTTPS利於匿名訪問,適合開源項目可以方便被別人克隆和讀取(但他沒有push權限);畢竟爲了克隆別人一個倉庫學習一下你就要生成個ssh-key折騰一番還是比較麻煩,所以github除了支持ssh協議必然提供了https協議的支持。
而SSH協議使用公鑰認證比較適合內部項目。 當然了現在的代碼管理平臺例如github、gitliab,兩種協議都是支持的,基本上看自己喜好和需求來選擇就可以了。
簡單理解ssh協議
ssh的協議理解起來比https簡單多了,大家可以參考阮一峯老師的這篇文章SSH原理與運用 和 我的這篇文章ssh建立通道和認證原理。
總結來看,就是SSH協議使用目前已經比較成熟的RSA這類非對稱加密技術來實現了安全祕鑰的協商: 目標主機把自己的公鑰發送給客戶端,客戶端用公鑰加密 一些東西
之後傳給服務器,服務器用RSA私鑰從中解出 一些東西
,保證了 一些東西
防篡改、防泄密,最終協商出只有雙方纔知道的通信密鑰。
github上使用ssh協議
如果要使用ssh協議來克隆或者push github上的代碼,則git程序會採用ssh的校驗機制。而由於github上所有倉庫都是採用共用git賬號
體系的方式, 是無法用git用戶登錄github服務器的。各個用戶只能通過公鑰認證的方式使用此SSH賬號訪問版本庫。 因此,你在執行 git clone
命令之前,必須確保已經把ssh公鑰放置到了github服務器上。
生成公鑰可以看這裏: github官方公鑰配置教程
RSA公鑰生成後,可以用mac上的拷貝命令,把公鑰拷貝到剪切板:
# Copies the contents of the id_rsa.pub file to your clipboard # pbcopy < ~/.ssh/id_rsa.pub |
然後,去github上把這個公鑰拷貝到網站的個人配置中(相當於在github服務器的~/.ssh/authorized_keys
),接下來就能愉快的進行克隆。
如果遠程主機是自己可以控制的機器,也可以這樣:
ssh-copy-id user@host 或 scp -P 22 id_rsa.pub [email protected]:/root/.ssh/authorized_keys 或追加 cat ~/.ssh/id_dsa.pub|ssh -p 22 [email protected] `cat - >> ~/.ssh/authorized_keys` |
注意一點: 當你把公鑰設置到github上時,你會在UI界面上看到一個 fingerprint
的指紋,這個指紋其實就是你的公鑰的指紋。你可以對比這個指紋是否跟你本機的公鑰指紋相同,儘量把github上不熟悉的公鑰都刪掉
公鑰指紋可以參考這篇文章:ssh建立通道的過程和認證原理
HTTPS協議如何保存憑證信息
HTTPS認證方式雖然需要輸入賬戶密碼,但現在也不需要每次都輸入。這個憑據保存需要依賴一個憑據管理器,每個操作系統平臺都有自己的憑據管理器。可以參考github官方提供的教程來配置
我這裏介紹一個git的憑據管理方式:
# 建立憑據文件 $ touch ~/.git-credentials $ vim ~/.git-credentials |
在文件中加入帶憑據的url信息:
https://{username}:{passwd}@github.com |
然後告訴git使用這個憑據管理器:
$ git config --global credential.helper store |
上面命令會在git配置文件 ~/.gitconfig
中設置上一個憑據地址:
[credential] helper = store |