2013-02-26 55 views
0

如果您按照GitHub HowTo「Generating SSH Keys」,您可以在您的~/.ssh目錄中獲得三個文件:known_hosts,id_rsaid_rsa.pubGitHub認證如何工作?

文件known_hosts用於服務器認證,id_rsa用於客戶端認證(here是一篇文章,說明差異)。

爲什麼我應該創建/爲什麼GitHub確實需要兩個 - 一個主機和一個用戶認證文件? GitHub認證如何工作?

Thx

回答

0

這只是普通的舊的SSH認證;沒有關於它是特定於GitHub的。

id_rsaid_rsa.pub是你的密鑰的兩半:私鑰和公鑰。實際上,公鑰是私鑰的鎖。您可以將鎖(公鑰)放在任何您想要訪問的服務器上,而不必擔心別人會看到它,因爲它只是一個鎖。您將(專用)密鑰保存在您的計算機上,並使用它來登錄到這些服務器;他們看到你有一個關鍵配件的鎖,讓你在

(不是說你應該把你的公鑰對完全不可信任的機器;還有,可以採取像ssh -A快捷方式的優勢惡意技巧)。

known_hosts實際上並沒有多大關係;它只是在ssh存儲您連接的所有服務器的指紋,因此如果指紋發生變化,它可能會發出一個很大的可怕警告。 (這意味着它不是同一臺機器:服務器端發生了根本性的變化,或者連接被劫持)。

因此,無論如何,Git本身可以理解的一個協議是SSH。當您使用[email protected]:...作爲存儲庫URL時,Git僅通過SSH進行連接。當然,GitHub不希望你在他們的機器上玩耍,所以他們只會讓你做Git的東西,而不是完整的shell。

像往常一樣,Arch wiki有這個更多的話。

+0

感謝您對「簡單的舊SSH認證」的暗示。我首先了解了這個問題。我認爲「無論是主機認證還是用戶認證」。但這只是驗證過程的兩個步驟。 (對於講德語的用戶:http://www.jfranken.de/homepages/johannes/vortraege/ssh1_inhalt.de.html#ToC14) – automatix 2013-02-26 23:57:17

2

只要您通過SSH實際連接到主機,ssh就會使用known_hosts文件。它存儲服務器的簽名密鑰。那麼,如果它改變了,你就會知道。

ssh-keygen -t rsa -C [email protected]用於生成SSH密鑰,您將在其中將id_rsa.pub指定給github。然後,當您連接到github時,您的~/.ssh文件夾中有專用密鑰id_rsa,該文件夾隨後用於通過github驗證您的信息。

這是一個非常低級的解釋,但私鑰(非.pub)文件是你的結局,.pub用於github,known_hosts用於你的盒子知道是什麼。

您還可以在~/.ssh產生config文件用於指定哪些鍵,可進入

的authorized_keys和known_hosts中是哪臺主機..完全不同..

你的SSH服務器(sshd的,即)使用authorized_keys或/etc/ssh/sshd_config/中定義的任何文件來了解另一個密鑰的公共方面。所以當用戶連接到你的服務器時,他們通過他們的私鑰,你的SSH服務器驗證它在authorized_keys中的公鑰,如果它不匹配,它就不起作用。

Github對他們的用戶保留一個authorized_keys的發言權。你的公鑰進入你的賬戶中的authorized_keys,然後當你通過ssh連接克隆,推送等時,它會檢查你使用你已知的公鑰發送的私鑰。

1
  • known_hosts存儲服務器的身份第一次連接,讓你知道你正在連接到同一臺服務器下一次。這可以防止有人在下次連接時冒充服務器(但可惜不是第一次)

  • id_rsa是您的祕密密鑰,證明您確實是您。 絕對不要將此事告知

  • id_rsa.pub是公鑰,其認證的目的基本上是證明你有密鑰而不給它。這個關鍵你可以給任何人需要它,因爲它沒有什麼祕密。

當你連接到服務器,SSH第一checks that the server has the correct key(即它應該與一個在known hosts。如果客戶是舒適的服務器是真實的,它使用私人密鑰簽署the following data併發送它給服務器;

string session identifier 
    byte  SSH_MSG_USERAUTH_REQUEST 
    string user name 
    string service name 
    string "publickey" 
    boolean TRUE 
    string public key algorithm name 
    string public key to be used for authentication 

服務器驗證使用公共密鑰(您先前上傳至Github上)簽字,如果是正確的,客戶端通過驗證

+0

這是一個很好的解釋,'known_hosts','id_rsa'和'id_rsa.pub',但不是我的問題的答案。 – automatix 2013-02-26 23:18:41

+0

謝謝你的解釋,你添加了! – automatix 2013-02-26 23:53:24