SSH 金鑰:免密碼登入遠端主機、傳遞檔案

覺得打密碼很麻煩嗎?透過 Public Key Authentication 的方式,可以讓你不需輸入密碼就透過 SSH 進入你的遠端主機。

Public Key Authentication 是透過非對稱金鑰的方式來驗證 SSH 登入。所謂的非對稱金鑰是指,我們會產生兩把鑰匙:一把稱為公鑰(Public Key)、另一把稱為私鑰(Private Key),其中一個用來加密資料,就必須拿對應的金鑰解密才能得到原本的資料。

非對稱金鑰金鑰示意圖(Nicobon,CC-BY-SA 4.0,WikiMedia):

在實作免密碼登入 SSH 時,首先我們要產生一組公私鑰──由於私鑰必須自己保管,所以放在自己的機器(本機)上,公鑰則放到遠端主機。每次登入前,我們會先用私鑰傳送一段資料到遠端主機,遠端主機透過公鑰解開確定沒錯後,就可以達到免密碼登入的功能。

是怎麼做到一把公鑰、一把私鑰可以分別加密和解密的?
非對稱加密?到底是什麼鎖可以有兩把鑰匙,用簡單數學解釋給你聽

產生金鑰

首先要先在 Client 端設定一組金鑰。只要使用 ssh-keygen 指令就可以了:

ssh-keygen

產生鑰匙的過程中會詢問幾個問題,例如要放在哪裡:

Generating public/private rsa key pair.
Enter file in which to save the key (/home/noob/.ssh/id_rsa):

這些直接按下 Enter 保持預設值就可以了。另外也會詢問金鑰的保護密碼,由於我們是要達到免密碼登入,所以也直接按下 Enter 略過:

Enter passphrase (empty for no passphrase):

最後則會看到產生的金鑰:

Your identification has been saved in /home/noob/.ssh/id_rsa.
Your public key has been saved in /home/noob/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:O92QuN2lx4vHmgVTHsnAKKWKp+dAdQKOOq6B09wfD9E noob@My-Computer
The key's randomart image is:
+---[RSA 2048]----+
|    .    ..o.    |
|   o .  ... .o . |
|  . . o o.    =  |
| .   o = . . o . |
|o   o + E o o o  |
|o+ o o . = + *   |
|+.o + + + o +.+  |
|.o   = + .   =o. |
|.     o .   +o.  |
+----[SHA256]-----+

放在使用者資料夾下的 .ssh 資料夾中,其中 id_rsa 為私鑰、id_rsa.pub 則為公鑰。

上傳金鑰

接著要把你的金鑰上傳到你的遠端主機上,你可以透過這個指令:

# ssh-copy-id [user]@[host]
ssh-copy-id noob@it30.noob.tw

接著試試看,直接 ssh 到你的遠端主機,是不是不會向你詢問密碼了呢?

免登入直接讀寫 GitHub Private Repository

你產生的公鑰,不只可以用在遠端主機的 SSH 登入。你的 GitHub 如果有私有的 Repository 的話,也可以透過這個方式免輸入密碼的 clone、pull 和 push。

首先到 GitHub 個人設定中,SSH and GPG Keys 裡點選 New SSH key,接著將你 id_rsa.pub 檔案中的內容直接貼到 Key 中,並按下 Add SSH key 即可。

記得設定完公鑰的電腦,以後要走 SSH 協定而不是 HTTPS 協定,才能有免密碼的功能!

本篇文章同步發表在 iT邦幫忙