Git——The stupid content tracker(傻瓜內容跟蹤器)
git是Linux的締造者Linus Torvalds為了幫助管理linux內核源碼而開發的一款免費、開源的分布式版本控制系統。
分布式Git相比集中式CVS/SVN的最大區別在於開發者可以提交到本地,每個開發者通過克隆(git clone),在本地機器上拷貝一個完整的Git倉庫。
如果用CVCS的話,差不多所有操作都需要連接網絡;Git中的絕大多數操作都只需要訪問本地文件和資源,由於本地磁盤上就保存着所有當前項目的歷史更新,因此可以不用聯網且處理起來速度很快。
大多數 Git 服務器都會選擇使用 SSH 公鑰來進行無密碼登錄連接。
SSH——Secure SHell(安全外殼協議)
SSH是建立在應用層和傳輸層基礎上,默認端口是22,為遠程登錄會話和其他網絡服務提供安全性的協議。SSH是替代Telnet(默認端口是23)和其他遠程控制台管理應用程序的行業標准。
SSH服務最早是由芬蘭的一家公司開發的UNIX系統上的一個程序,后來迅速擴展到其他操作平台,現在已經發展到SSH2版本。SSH只是一種協議,存在多種實現,既有商業實現,也有開源實現。由於版權和加密算法等因素的影響,很多人開始轉用開源免費的openSSH(Linux/Mac OS X標配)。
SSH提供基於密鑰的認證機制,你必須為自己創建一對非對稱密鑰(public/private key pair),並把公鑰放到需要訪問的服務器上進行授權。SSH1使用RSA(RonRivest、AdiShamir、LeonardAdleman)加密密鑰,SSH2使用DSA(Digital Signature Algorithm,數字簽名算法)密鑰保護連接和認證。RSA和DSA這兩種加密算法都是非對稱加密算法。
所謂“SSH公鑰認證免密碼登錄認證機制”,原理如下:
(1)SSH客戶端提前將SSH公鑰儲存在遠程SSH服務器上,然后SSH客戶端攜帶公鑰向遠程SSH服務器(known_hosts)發起登錄請求。
(2)遠程SSH服務器收到該請求之后,先在該服務器上的authorized_keys尋找你上傳授權過的公鑰,然后把它和你發送過來的公鑰進行比較。
(3)如果兩個公鑰一致(Key Exchange Success),遠程SSH服務器會向用戶發送一段使用SSH公鑰加密過的隨機字符串進行身份質詢(Challenge)。
(4)SSH客戶端用自己的私鑰解密后再發回給遠程SSH服務器,遠程SSH服務器對比回包中解密出來的隨機字符串是否一致。如果一致,則證明用戶(公鑰或身份)是可信的,直接允許登錄shell,不再要求密碼。
Mac上預裝的git和OpenSSH
1.使用ssh-keygen命令生成key pair:
--------------------------------------------------------------------------------
$ssh-keygen -t rsa -C "${YourEmail}" # "-t rsa"表示使用密鑰的加密類型,還可以為dsa;-C設置注釋文字,比如你的郵箱“YourEmail”,不一定要是github注冊郵箱
Enter file in which to save the key (/Users/faner/.ssh/id_rsa): # 直接回車
Enter passphrase (empty for no passphrase): # 輸入密鑰文件授權密碼
Enter same passphrase again: # 確認密鑰文件授權密碼
Your identification has been saved in /Users/faner/.ssh/id_rsa.
Your public key has been saved in /Users/faner/.ssh/id_rsa.pub.
--------------------------------------------------------------------------------
此時,敲入ls命令可以看到ssh-keygen在~/.ssh目錄下生成的public/private key pair,其中id_rsa為密鑰對中的私鑰,需妥善保管;id_rsa.pub為密鑰對中的公鑰,可任意公開。
RSA是一種支持變長密鑰的公共密鑰算法,需要加密的文件塊的長度也是可變的。DSA(Digital Signature Algorithm,數字簽名算法)是一種標准的DSS(數字簽名標准)。
id_rsa私鑰類似keychain進行CSR時生成的private key;id_rsa.pub公鑰則類似CSR申請下來的開發證書(在Apple Member Center中有在線備案)。
通過cat命令可以查看id_rsa.pub內容。
2.在github上為當前賬號添加SSH公鑰:
(1)這里Add SSH Key相當於注冊到SSH服務器(github.com)的受信任列表(authorized_keys)中。
(2)SSH服務器受信任列表(authorized_keys)中可以添加多個SSH客戶端的公鑰,其中title用於做簡單識別,真正起識別作用的是公鑰指紋(RSA key fingerprint)。
(3)向SSH服務器(github.com)Add自己的SSH Public Key后,github.com將這個SSH Key與你的github賬號關聯起來,你的機器(Mac git client)將有寫權限向你github賬號名下的remote repository進行push提交代碼。
3.測試與github服務器的SSH連接:
(1)當沒有使用ssh-keygen生成公鑰時,執行ssh -T git@github.com,將會提示can`t be estabblished for permission denied without public key(SSH不支持匿名訪問):
【1】Are you sure you want to continue connecting (yes/no)? yes#接受認可遠程主機的公鑰(可以核對官方給出的公鑰指紋)。
【2】Warning:Permanently added ‘github.com, 192.30.252.128’(RSA) to the list of known_hosts. #github.com服務器主機已經得到認可被添加到~/.ssh/known_hosts中,可以執行cat known_hosts查看該文件。
(2)本機通過ssh-keygen生成公鑰后,執行ssh -T git@github.com:
(1)Permanently added the RSA host key for IP address‘192.30.252.131’to the list of known hosts:github.com(192.30.252.131)被添加到~/.ssh/known_hosts中。可以執行cat查看~/.ssh/known_hosts文件,實際上保存的是github.com的SSH RSA公鑰(格式類似id_rsa.pub中的ssh-rsa ...),也即SSH客戶端(本機)和SSH服務器(github.com)之間相互交換了SSH公鑰。下次再連接github.com,系統認出它的公鑰已經保存過本地了,從而跳過警告部分。
(2)提示“Saving password to keychain failed”:是因為沒有勾選【在我的鑰匙串中記住密碼】。勾選之后重新測試:
(3)提示“Hi !You've successfully authenticated”:表明你已經成功為本機設置SSH密鑰對,且與github服務器身份校驗通過。
(4)提示“but GitHub does not provide shell access”是因為github提供的HTTPS方式,而不是SSH方式,查一下你設置的git庫的remote url,看看使用的是哪種連接方式。
(5)可以添加-v開關(ssh -vT git@github.com),打開Verbose模式,SSH在連接過程中將打印debug1級別的調試跟蹤信息。
(6)如果使用了VPN(GreenVPN)或Proxy(GoAgent/TOR),可能導致訪問github時,Chrome瀏覽器將提示【此網站的安全證書存在風險】而連接失敗(ERR_CONNECTION_REFUSED)。
這可能是被邪惡的中間人GFW盯上了,篡改了github的證書。Chrome使用的是操作系統的證書體系,因此可到Mac OS X的Keychain Acces中刪掉系統根證書(CNNIC證書清除方法 - RevokeChinaCerts)中的CNNIC根證書注意刪除根證書會連帶刪除各級衍生子證書,故此舉需謹慎)。恢復了“良民”身份后,重新訪問github,Mac系統會重新下載CNNIC根證書以及GitHub證書洗白身份,又可以訪問了github.com網站了!更堅決一點的做法是在鑰匙串-系統根證書中雙擊CNNIC ROOT,在【信任】|【使用此證書時】下拉選擇【永不信任】。
參考:
4.git clone下載開源git庫Reachability:
(1)Add SSH Key to GitHub后,登錄github,在github開源項目網頁中有三種Clone URL:
- Subversion Clone URL,即工程github網頁地址:https://github.com/tonymillion/Reachability,可通過subversion客戶端進行checkout。
- HTTPS Clone URL:https://github.com/tonymillion/Reachability.git,可通過git客戶端clone版本庫,需要輸入賬戶密碼。
- SSH Clone URL:git@github.com:tonymillion/Reachability.git,可通過git客戶端clone版本庫,基於SSH公鑰認證免密碼輸入。
若沒有登錄github.com,或登錄但沒有添加SSH Key,將沒有SSH Clone URL。
(2)在Mac Terminal中使用"git clone${SSH url}"命令克隆git版本庫到本地目錄(~/Projects/git)。
參考:
《git和svn之間的五個基本區別》《git和svn的比較》
《git和svn的詳細比較》《git替代svn的可行性分析》
《Git使用SSH公鑰進行認證連接》《使用SSH密鑰連接github》
《Git基本知識及MAC安裝使用》《Mac下git與github的簡單使用》
《理解 Xcode 中的 Git 版本控制》《在Xcode中使用Git進行源碼版本控制》
《Git教程-使用GitHub》《從github下載某個git庫的四種方法》
原文地址:http://blog.csdn.net/phunxm/article/details/45083335