# 使用 SSH 公鑰驗證
通常情況下,訪問遠程服務器上的 Git 倉庫要受到限制。你可能不希望任何人都能讀取文件,或者至少不能改動文件吧。在這種情況下,進行有效的認證就是非常必要地。
你可能已經通過你所使用的瀏覽器了解了 “HTTPS” 協議,盡管它使用起來很簡單,但是很多系統管理員還是會出于各種原因去選擇使用更為普遍的 “SSH” 協議。在這種協議之下,當涉及到身份驗證時,你就很可能需要 “SSH公鑰”。
對于這種類型的驗證需要一對密鑰:一個公鑰和一個私鑰。私鑰,顧名思義就是必須在任何情況下都保持絕對私有。它所對應的公鑰則相反,應該是被安裝到那些你需要登陸的服務器上。
當通過 SSH 試圖建立連接時,如果客戶端提供的私鑰能和在服務器上所安裝的公鑰相匹配,那么這個客戶端才會被授予訪問權限。

## 創建一個公鑰
在創建公共密鑰前,你應該檢查一下是否已經存在了一個:
```
$ ls ~/.ssh
```
如果在輸出列表里已經存在了一個名為 “id_rsa.pub” 或是 “id_dsa.pub” 的文件,這就代表你已經有了一個密鑰。在這種情況下,你可以把這個文件發給你的服務器管理員。如果你使用的是像 GitHub 或 Beanstalk 這樣的托管服務,那就要把它上傳到你的帳戶中。
如果還沒有任何密鑰,你只須要執行下面這個命令來創建一個:
```
$ ssh-keygen -t rsa -C "john@example.com"
```
在 “-t” 參數之后,我們請求建立一個 “RSA” 類型的密鑰。RSA 是當前最新并且最安全的一種形式。在 “-C” 參數之后,我們提供了一個注釋,你可以把它想象為對這個密鑰的一種描述或標簽。例如使用你的 email 地址。總之,一個能讓你之后更容易識別的注釋。
在確認此命令后,您會被詢問一些信息:
* (1) 給這個新的密鑰輸入一個名稱,保留默認的名字和設置。
* (2) 提供一個密碼。雖然 SSH 公鑰可以確保在沒有任何密碼的情況下安全地使用,但是你還是應該設置一個密碼,用來進一步提高安全性。
```
$ ssh-keygen -t rsa -C "john@example.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/tobidobi/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/tobidobi/.ssh/id_rsa.
Your public key has been saved in /Users/tobidobi/.ssh/id_rsa.pub.
The key fingerprint is:
87:23:34:de:35:d0:f2:78:05:a4:78:1b:f1:6a:7e:be john@example.com
The key's randomart image is:
+--[ RSA 2048]----+
| . = o |
| ..o.. |
| . o S . |
| . . . o |
| . + + . o |
| . S = + o. |
| . . + + . o |
| o . |
| o .|
| .Eo|
+-----------------+
```
現在,兩個密鑰文件被創建出來了:“**id_rsa.pub**”(你的公鑰)和 “**id_rsa**”(你的私鑰)。如果你使用的是 Mac,你可以在你 home 目錄下的 “.ssh” 目錄中找到它們(~./ssh/)。在 Windows 中,它們應該存放在 C:\Documents and Settings\your-username.ssh\ 或是 C:\Users\your-username.ssh 中。
如果你想看看你的公鑰文件的實際內容,你將會看到這些內容:
```
$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAB3nZaC1aycAAEU+/ZdulUJoeuchOUU02/j18L7fo+ltQ0f322+Au/9yy9oaABBRCrHN/yo88BC0AB3nZaC1aycAAEU+/ZdulUJoeuchOUU02/j18L7fo+ltQ0f322AB3nZaC1aycAAEU+/ZdulUJoeuchOUU02/j18L7fo+ltQ0f322AB3nZaC1aycAAEU+/ZdulUJoeuchOUU02/j18L7fo+ltQ0f322AB3nZaC1aycAAEU+/ZdulUJoeuchOUU02/j18L7fo+ltQ0f322klCi0/aEBBc02N+JJP john@example.com
```
這就是公鑰的內容,你需要把它安裝在你所需要登陸的遠程服務器上。如果你的項目開發團隊擁有自己的服務器,那么你只需要把它提供給你的服務器管理員就可以了。如果你使用的是像 GitHub 或 Beanstalk 這樣的托管服務,你則必須把它上傳到你的帳戶上。
你要把公鑰的內容完全一模一樣地復制出來,你可以使用下面的命令來安全方便地復制這些內容到你的剪貼板上:
```
$ pbcopy < ~/.ssh/id_rsa.pub [on Mac]
$ clip < ~/.ssh/id_rsa.pub [on Windows]
```
- Learn Version Control with Git 中文版
- 前言
- Part 1 - 基礎知識
- 什么是版本控制?
- 為什么要使用版本控制系統?
- 準備工作
- 版本控制的基本工作流程
- 從一個未被納入版本控制的項目開始
- 從一個已被納入版本控制的項目開始
- 工作在你的項目上
- Part 2 - 分支與合并
- 分支可以改變你的生命
- 在分支上工作
- 暫時保存更改
- 切換一個本地分支
- 合并改動
- 分支的工作流程
- Part 3 - 遠程倉庫
- 關于遠程倉庫
- 連接一個遠程倉庫
- 查看遠程數據
- 整合遠程的改動
- 發布一個本地分支
- 刪除分支
- Part 4 - 高級應用
- 撤銷操作
- 用 diff 來檢查改動
- 處理合并沖突
- Rebase 代替合并
- 子模塊
- git-flow 的工作流程
- 使用 SSH 公鑰驗證
- Part 5 - 工具與服務
- 桌面應用程序
- 比較和整合工具
- 代碼托管服務
- 更多學習資源
- 附錄
- 版本控制的最佳實踐
- 命令 101
- 從 Subversion 過渡到 Git
- 為什么選擇 Git