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

某日push至github時出現以下錯誤:

Push failed

         Failed with error: error: RPC failed; result=56, HTTP code = 200

         fatal: The remote end hung up unexpectedly

         fatal: The remote end hung up unexpectedly

解決方案:

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只是一種協議,存在多種實現,既有商業實現,也有開源實現。由於版權和加密算法等因素的影響,很多人開始轉用開源免費的openSSHLinux/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 [email protected],將會提示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 [email protected]



(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 [email protected]),打開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[email protected]:tonymillion/Reachability.git,可通過git客戶端clone版本庫,基於SSH公鑰認證免密碼輸入。

若沒有登錄github.com,或登錄但沒有添加SSH Key,將沒有SSH Clone URL。


(2)在Mac Terminal中使用"git clone${SSH url}"命令克隆git版本庫到本地目錄(~/Projects/git)。


參考:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章