Mac下git通過SSH進行免密碼安全連接github


Git——The stupid content tracker(傻瓜內容跟蹤器)

gitLinux的締造者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)如果使用了VPNGreenVPN)或ProxyGoAgent/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,在【信任】|【使用此證書時】下拉選擇【永不信任】。

參考:

GitHub 和中間人攻擊》《github.com的證書變自簽名了?

github.com使用了無效的安全證書》《github 訪問超時使用goagent解決方案

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的可行性分析

 

SSH在linux安全中的作用》《SSH配置講解大全

RSA算法原理(一)》《RSA算法原理(二)

SSH原理與運用(一)》《SSH原理與運用(二)

SSH和SSH2》《使用SSH公鑰實現免密碼登錄

Git使用SSH公鑰進行認證連接》《使用SSH密鑰連接github

 

Git基本知識及MAC安裝使用》《Mac下git與github的簡單使用

Mac下的Git客戶端》《在Xcode中配置使用Git

理解 Xcode 中的 Git 版本控制》《在Xcode中使用Git進行源碼版本控制

 

Git教程-使用GitHub》《從github下載某個git庫的四種方法

 

 

原文地址:http://blog.csdn.net/phunxm/article/details/45083335

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM