SSH key - 從產生、設定到撤銷
SSH (Secure Shell) 是我們遠端連線到伺服器的常用工具。相較於每次都輸入密碼,使用 SSH 金鑰對(Key Pair)不僅更安全,也更方便。
這篇文章將引導你完成 SSH 金鑰的產生、將公鑰複製到目標電腦、設定 SSH Config 以簡化連線,以及在金鑰外洩時如何撤銷它。
什麼是 SSH 金鑰對?
SSH 金鑰對包含兩個部分:
私鑰 Private Key:
儲存在你的本機電腦上,絕對不能外洩。它就像你的秘密通行證。預設路徑通常是~/.ssh/id_rsa
或你指定的其他檔案。公鑰 Public Key:
可以安全地分享給任何人或放置在你想連線的伺服器上。它就像一個鎖,只有對應的私鑰才能打開。預設路徑通常是~/.ssh/id_rsa.pub
或對應私鑰檔名加上.pub
。
當你嘗試使用金鑰連線時,伺服器會使用你放在上面的公鑰來驗證你本機電腦上的私鑰,驗證成功後即可登入,無需輸入密碼。
步驟一:產生 SSH 金鑰對
在你的本機電腦上打開終端機 (Terminal),執行以下指令:1
ssh-keygen -t rsa -b 4096 -C "[email protected]"
讓我們解釋一下參數:
-t rsa
: 指定要產生的金鑰類型,rsa 是一種較舊的演算法,但仍然廣泛使用。你也可以選擇ed25519
,它是一種較新的橢圓曲線密碼學演算法,通常被認為比同等長度的 RSA 金鑰更安全且更有效率。
建議使用者根據自己的需求和安全性考量選擇金鑰類型。若要使用ed25519
,指令會是ssh-keygen -t ed25519 -C "[email protected]"
。-b 4096
: 指定金鑰的長度(位元數)。對於 RSA 金鑰,建議使用 4096 位元。ed25519
不需要指定長度。-C "[email protected]"
: 提供一個註解,通常用你的電子郵件地址,方便識別金鑰的用途。
執行指令後,系統會提示你:
輸入儲存金鑰的檔案路徑:
1
Enter file in which to save the key (/Users/your_username/.ssh/id_rsa):
你可以直接按 Enter 使用預設路徑 (
~/.ssh/id_rsa
),或者輸入一個新的路徑和檔名(例如~/.ssh/my_server_key
)。如果你管理多個金鑰,建議使用不同的檔名。
輸入密碼:
1
2Enter passphrase (empty for no passphrase):
Enter same passphrase again:這是一個強烈建議設定的密碼,用來保護你的私鑰檔案。即使私鑰檔案被他人取得,沒有這個密碼也無法使用。
如果留空,則使用此金鑰登入時不需要額外輸入密碼。
完成後,你指定的路徑下會產生兩個檔案:私鑰(例如 id_rsa
)和公鑰(例如 id_rsa.pub
)。
步驟二:將公鑰複製到目標電腦
為了讓目標電腦信任你的本機電腦,你需要將剛剛產生的公鑰複製到目標電腦的 ~/.ssh/authorized_keys
檔案中。
最簡單方便的方法是使用 ssh-copy-id
指令。假設你的目標電腦使用者名稱是 remote_user
,主機名稱或 IP 位址是 remote_host
,並且你剛剛產生的公鑰是預設的 ~/.ssh/id_rsa.pub
:1
ssh-copy-id remote_user@remote_host
如果你使用了非預設的金鑰檔名(例如 ~/.ssh/my_server_key.pub
),你需要使用 -i
參數指定公鑰路徑:1
ssh-copy-id -i ~/.ssh/my_server_key.pub remote_user@remote_host
執行此指令時,系統會要求你輸入 remote_user
在 remote_host
上的登入密碼(這是為了授權複製公鑰,僅需輸入這一次)。
成功後,你的公鑰內容會被附加到目標電腦的 ~/.ssh/authorized_keys
檔案末尾。
手動複製方法(如果沒有 ssh-copy-id)
在本機顯示公鑰內容:
1
cat ~/.ssh/id_rsa.pub # 或你的公鑰檔案路徑
複製顯示出來的整段文字(通常以
ssh-rsa
或ssh-ed25519
開頭)。SSH 登入目標電腦(此時仍需密碼):
1
ssh remote_user@remote_host
在目標電腦上,編輯
~/.ssh/authorized_keys
檔案(如果~/.ssh
目錄或authorized_keys
檔案不存在,需要先建立):1
2
3
4
5mkdir -p ~/.ssh # 確保目錄存在
chmod 700 ~/.ssh # 設定正確權限
touch ~/.ssh/authorized_keys # 確保檔案存在
chmod 600 ~/.ssh/authorized_keys # 設定正確權限
nano ~/.ssh/authorized_keys # 使用 nano 或其他編輯器開啟將步驟 2 複製的公鑰內容貼到檔案的新的一行,儲存並關閉檔案。
現在,你可以嘗試從本機再次 SSH 連線到目標電腦:1
ssh remote_user@remote_host
如果你的私鑰沒有設定密碼,應該可以直接登入。如果設定了密碼,系統會提示你輸入私鑰的密碼 (Enter passphrase for key '/Users/your_username/.ssh/id_rsa':
)。
步驟三:設定 SSH Config 簡化連線
每次連線都要輸入 ssh remote_user@remote_host
,如果有多台主機或使用了非預設的金鑰,會變得很麻煩。我們可以編輯本機的 SSH 設定檔 ~/.ssh/config
來簡化這個過程。
編輯或建立 ~/.ssh/config
檔案:1
nano ~/.ssh/config
在檔案中加入類似以下的設定區塊:1
2
3
4
5Host my_server # 自訂一個好記的主機別名
HostName remote_host # 目標主機的實際 IP 位址或網域名稱
User remote_user # 登入目標主機的使用者名稱
IdentityFile ~/.ssh/my_server_key # 指定使用的私鑰檔案路徑 (如果不是預設的 id_rsa)
# Port 2222 # 如果 SSH 不是使用預設的 22 Port,取消註解並修改
說明:
- Host my_server: 定義一個別名,以後連線只需要輸入
ssh my_server
。 - HostName: 目標主機的真實位址。
- User: 登入的使用者名稱。
- IdentityFile: 重要! 指定連線到這個 Host 時要使用的私鑰檔案路徑。
如果你的私鑰是預設的~/.ssh/id_rsa
或~/.ssh/id_ed25519
等,SSH 會自動嘗試它們,你可以省略這一行。但如果你為特定主機產生了專用金鑰(例如my_server_key
),就必須指定。 - Port: 如果目標主機的 SSH 服務不是監聽在標準的 22 Port,你需要指定正確的 Port 號。
儲存檔案後,設定 ~/.ssh/config
的權限(如果檔案是新建的):1
chmod 600 ~/.ssh/config
現在,你可以用更簡單的方式連線了:1
ssh my_server
SSH 客戶端會自動讀取 ~/.ssh/config
檔案,找到 Host my_server 的設定,並使用指定的 HostName, User, IdentityFile 和 Port 來進行連線。
以下是一些更詳細的 SSH Config 範例:
- 使用通配符
Host *
來設定所有主機的預設選項。 - 設定
ForwardAgent yes
以啟用 SSH Agent forwarding。 - 使用
ServerAliveInterval
和ServerAliveCountMax
來保持連線。
範例:1
2
3
4
5
6
7
8
9Host *
ServerAliveInterval 60
ServerAliveCountMax 3
Host my_server
HostName remote_host
User remote_user
IdentityFile ~/.ssh/my_server_key
ForwardAgent yes
步驟四:撤銷外洩的金鑰
如果不幸地,你的私鑰檔案外洩了(例如筆記型電腦遺失或被駭),你需要立即在你所有使用過這個金鑰的目標電腦上撤銷它的授權。
撤銷的方法很簡單:登入到目標電腦,並從 ~/.ssh/authorized_keys
檔案中移除對應的公鑰。
使用其他方式(例如密碼或其他未外洩的金鑰)SSH 登入目標電腦:
1
ssh remote_user@remote_host
編輯 authorized_keys 檔案:
1
nano ~/.ssh/authorized_keys
找到代表已外洩金鑰的那一行公鑰(通常可以透過結尾的註解,例如你的電子郵件地址來辨識)。
刪除那一整行。
儲存並關閉檔案。
完成後,持有該外洩私鑰的人將無法再使用它登入這台目標電腦。記得在所有你曾放置過該公鑰的伺服器上都執行這個撤銷步驟。
結論
使用 SSH 金鑰可以大幅提升遠端連線的安全性和便利性。
透過 ssh-keygen
產生金鑰、ssh-copy-id
部署公鑰,以及設定 ~/.ssh/config
簡化連線,你可以更有效率地管理你的伺服器。
同時,了解如何在必要時撤銷金鑰,也是保障系統安全的重要一環。養成良好的金鑰管理習慣,讓你的遠端作業更加順暢安心!