一、基本流程說明
--------
### 1. 私密與公開金鑰
以 SSH 登入任何主機都必需要打帳號、密碼,除了*不方便*、另外還*增加了被竊取的風險*(有些軟體如 winscp 是可儲存的)。
解決的方式就是使用*金鑰產生器*來產生一筆*公開金鑰*(Public Key)與*私密金鑰*(Private Key)對應做免密碼的登入。
使用者只需*將公開金鑰的內容附加系統上特定的檔案中*,以及*在自己的環境指定好私密金鑰*,系統在登入流程中即會自動對應,正確無誤即可登入。
讓整個登入流程快速且安全。
### 2. 金鑰種類
但是對應並沒有想像中這麼簡單,就像是木門上只能裝喇吧鎖而無法裝大鎖,*不同的主機所能使用的金鑰機制也有所不同*:
SSH 有 Protocol 1 及 Protocol 2 兩種,常見金鑰編碼機制則有 RSA1、RSA2、以及 DSA 等三種。
### 3. 保護金鑰的措施
而另外一個問題,如果有人拿到了你的私密金鑰,就相當於他可以在你的主機為所欲為。
保護的措施就是使用 *Passphrase*(也可以不設)、私密金鑰的密碼,每次要用時就得輸入。
### 4. Agent 機制
有 Passphrase 保護當然是安全多了,但原本想用金鑰的好處就是可以省去每次打密碼的步驟,
現在若每次又得打 Passphrase,這樣的好處就沒有了,可能還得多記一套密碼、增加打錯的可能性。
還好有 Agent 機制,他相當是你的*管家*、我們只要*把鑰匙及 Passphrase 請他保管*,在登入主機時他就會*幫你解決輸入 Passphrase 的問題*。
二、一步一步教到會
---------
以下就只針對 Mac OSX 及 \*nix 系統做介紹(若你是使用 Windows 中的 PuTTY,請先做完步驟一與二,再看[這裡](http://josephj.com/article/putty-key/)):
###
步驟 1. 產生金鑰
在 Command Line 中你可以使用 ssh-keygen 來產生各種類的金鑰,而我也會鼓勵大家*一次把三種金鑰產生好*,省得碰到不同系統麻煩。
#### a. 產生 RSA 1 金鑰
這種金鑰是給比較舊的系統,例如 FreeBSD 4 及以前的版本、是走 SSH Protocol 1 的,最好就使用 RSA 1 這種金鑰
`$
ssh-keygen -t rsa1Generating RSA keys: Key generation complete.
Enter file in which to save the key ($HOME/.ssh/identity): [按 Enter 使用預設值(建議)]
Enter passphrase:
輸入你的 Passphrase [建議要使用 passphrase,最少 9 碼]
Enter same passphrase again:
再一次輸入你的 PassphraseYour identification has been saved in /home/username/.ssh/identity.
Your public key has been saved in /home/username/.ssh/identity.pub.
The key fingerprint is: 6c:96:8c:a8:86:1b:3b:eb:1b:48:8d:3d:8d:c1:4f:dc username@abc.com`#### b. 產生 RSA 2 金鑰
比較新的系統,如 FreeBSD 5 及之後版本或 Linux,用 RSA 2 或 DSA 這兩種金鑰
` $
ssh-keygen -t rsaGenerating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa): [按 Enter 使用預設值(建議)]
Enter passphrase:
輸入你的 PassphraseEnter same passphrase again:
再一次輸入你的 PassphraseYour identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.
The key fingerprint is: cc:e8:a9:da:a3:41:c6:a9:97:52:59:ef:0c:cf:45:b6 username@abc.com `#### c. 產生 DSA 金鑰
` $
ssh-keygen -t dsaGenerating public/private dsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_dsa): [按 Enter 使用預設值(建議)]
Enter passphrase:
輸入你的 PassphraseEnter same passphrase again:
再一次輸入你的 PassphraseYour identification has been saved in /home/username/.ssh/id_dsa.
Your public key has been saved in /home/username/.ssh/id_dsa.pub.
The key fingerprint is: cc:e8:a9:da:a3:41:c6:a9:97:52:59:ef:0c:cf:45:b6 username@abc.com `經過這樣的程序,我們總共會有公私鑰共三對:RSA1 ( identity.pub / identity )、RSA2 ( id\_rsa.pub / id\_rsa )、及 ( id\_dsa.pub / id\_rsa )。
我過去有一個錯誤的觀念,以為金鑰是對應系統的,所以在對每一台主機得另外產生一次。
事實上如果沒有特殊需求,你*可以只用一份、用任一系統產生、並把這一份給保存好即可*。希望大家不要跟我有一樣的錯誤囉!
### 步驟 2. 將公開金鑰放到主機
你現在在自己的機器上已經有了三對金鑰,接下來我們要把公開的三隻 (\*.pub) 放到我們要登入的主機上。
` $ scp ~/.ssh/*.pub
你欲登入的主機:~/.ssh/. `接著登入該系統,在沒設定好之前當然還是得乖乖打密碼
` $ ssh
你欲登入的主機 `系統預設處理放置公鑰的檔案叫做 *authorized\_keys*,所以我們要把剛剛所傳的公鑰附加到這個檔案中:
` $ cat ~/.ssh/identity.pub >> ~/.ssh/authorized_keys
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
$ chmod 711 ~/.ssh
$ chmod 644 ~/.ssh/authorized_keys `如果沒有意外,你登出再登入主機,就會看到它請你輸入 Passphrase 的訊息。
### 步驟 3. 設定 ssh-agent
前面所提到,每次都要打 Passphrase 就太麻煩了,所以這裡要設定管家 *ssh-agent*、以保管私鑰及 Passphrase。
在你每次啟動 shell 後,請照這樣的方式來做:
#### a. 啟動 ssh-agent
` $ eval `ssh-agent -s` `#### b. 將私密金鑰交給 ssh-agent 保管:ssh-add
我們將要用 *ssh-add* 來指定金鑰,如果你都照上面放預設的位置及相同的檔名,那就不用有任何的參數。
` $ ssh-add `接著會要求你設定輸入 passphrase,如果三個都一樣,就只要打一次。
` Enter passphrase for /home/username/.ssh/id_rsa:
你的 PassphraseIdentity added: /home/username/.ssh/id_rsa (/home/username/.ssh/id_rsa)
Identity added: /home/username/.ssh/id_dsa (/home/username/.ssh/id_dsa)
Identity added: /home/username/.ssh/identity (username@username.com) `接著再試看看登入已經放好公鑰的主機,應該就可以不用密碼登入了!
#### c. 自動化流程
如果每次進 Shell 都要做 a、b 動作,可能還是太麻煩且忘記,也因此我去找了可以放在 .bash\_profile 的 script (
[Joseph M. Reagle Jr](http://www.cygwin.com/ml/cygwin/2001-06/msg00537.html) ),
一進入 Shell 就會把該做的動作做好,且詢問你 Passphrase: ` SH_ENV="$HOME/.ssh/environment"
function start_agent {
echo "Initialising new SSH agent..."
/usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
echo succeeded
chmod 600 "${SSH_ENV}"
. "${SSH_ENV}" > /dev/lull
/usr/bin/ssh-add;
}
# Source SSH settings, if applicable
if [ -f "${SSH_ENV}" ]; then
. "${SSH_ENV}" > /dev/null
#ps ${SSH_AGENT_PID} doesn’t work under cywgin
ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
start_agent;
}
else
start_agent;
fi`
三、公私鑰所需放的機器
-----------
我的歸納是,在*本機*上你必需一直保有這兩份以便*後續的再製*。而公鑰整理成 authorized\_keys,以後*有新機器需要登入時一律傳此檔案上去做附加*。
而除了本機外,那些機器需要放私鑰呢?我的情況是*最常用的那台開發機*,因為你可能會利用他去 SSH 其它台機器。不然的話,應該*減少私鑰的存放地點,以求安全*。