SSH keygen: 完美指南供初學者使用

SSH(安全外殼)是安全地訪問遠端伺服器的必要工具。相較於使用密碼,SSH基於金鑰的認證方式提供了更強大的安全性,這是每位開發者必須掌握的知識。這篇文章將從SSH金鑰生成的基本概念到實際使用方法,以初學者的眼光,簡單而詳盡地為你解說。


為什麼需要SSH keygen?

傳統的密碼方式在輸入過程中存在被曝光的風險,並且對暴力破解攻擊相對脆弱。SSH金鑰通過使用一對金鑰(公鑰和私鑰)來解決這些問題。

  • 私鑰:安全地存儲在用戶的電腦上,絕對不能被外部曝光。只有擁有此金鑰才能訪問伺服器。
  • 公鑰:註冊在目標伺服器上的金鑰,即使公開也不會造成安全問題。

SSH連接時,伺服器會利用用戶的公鑰來加密認證請求,而用戶電腦的私鑰若能成功解密,則授予訪問權限。這樣一來,不需要傳送密碼就能安全地進行通訊。

SSH精靈傳遞公鑰的場景


生成SSH金鑰的方法:ssh-keygen命令

生成SSH金鑰的基本命令是ssh-keygen。開啟終端,輸入以下命令。

ssh-keygen

執行此命令後會出現幾個問題。我們逐一查看:

  1. Enter file in which to save the key (/home/youruser/.ssh/id_rsa):

    • 詢問憑證檔案的存儲路徑。如果沒有特殊理由,建議使用默認路徑.ssh/id_rsa。只需按Enter即可。

  2. Enter passphrase (empty for no passphrase):

    • 詢問是否設置私鑰的密碼。為了加強安全性,建議務必設置密碼。設置密碼後,即使私鑰泄露,只要不知道密碼也無法使用,從而實現雙重保護。輸入密碼時終端將不會顯示任何信息,請確保準確輸入後按Enter

  3. Enter same passphrase again:

    • 再次輸入之前的密碼以進行確認。
    • 預期結果:

Your identification has been saved in /home/youruser/.ssh/id_rsa
Your public key has been saved in /home/youruser/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx youruser@yourmachine
The key's randomart image is:
+---[RSA 3072]----+
|        .=*o.    |
|       . +.E+    |
|      . o.=. .   |
|       o  . o    |
|      . S  .     |
|       . .       |
|        .        |
|                 |
|                 |
+----[SHA256]-----+

金鑰生成完成後,會在~/.ssh/目錄中創建兩個文件。

  • id_rsa: 私鑰
  • id_rsa.pub: 公鑰

RSA與Ed25519:選擇哪種方式?

生成SSH金鑰時,可使用ssh-keygen命令的-t選項指定金鑰的加密方式。常用的方式有RSAEd25519

1. RSA方式 (-t rsa)

  • 自SSH誕生以來便被廣泛使用。
  • 已經過穩定性驗證,並與大多數系統兼容。
  • 可以指定金鑰的長度,通常建議使用4096位。
    • 示例:ssh-keygen -t rsa -b 4096

2. Ed25519方式 (-t ed25519)

  • 更新的加密方式,基於Curve25519橢圓曲線加密。
  • 相對於RSA,以更短的金鑰長度提供相同或更高水平的安全性
  • 金鑰生成與認證速度快,資源使用更少。
  • 大多數最新系統支持,但某些非常舊的系統可能不兼容。
    • 示例:ssh-keygen -t ed25519

推薦的方式及理由

目前如果沒有特別的兼容性問題,強烈建議使用Ed25519方式。

  • 更佳的安全性:即使是較短的金鑰長度也能提供強大的保護,使其對暴力攻擊更加抵抗。
  • 更快的性能:金鑰生成與認證過程更高效。
  • 簡單性:不必像RSA那樣考慮金鑰長度,可以輕鬆生成。

Ed25519金鑰生成示例

ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_my_server -C "my_server_ssh_key"
  • -t ed25519: 以Ed25519方式生成金鑰。
  • -f ~/.ssh/id_ed25519_my_server: 將金鑰檔案命名為id_ed25519_my_server。(可以用不同的名稱來區分於已有的id_rsa
  • -C "my_server_ssh_key": 為金鑰添加一個註釋,方便識別金鑰的用途,建議為其命名。

預期結果:

Generating public/private ed25519 key pair.
Enter passphrase (empty for no passphrase):  # 輸入密碼(建議)
Enter same passphrase again:                # 確認密碼
Your identification has been saved in /home/youruser/.ssh/id_ed25519_my_server
Your public key has been saved in /home/youruser/.ssh/id_ed25519_my_server.pub
The key fingerprint is:
SHA256:yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy my_server_ssh_key
The key's randomart image is:
+--[ED25519 256]--+
|      .+=+       |
|     . oE B      |
|      o + O      |
|     . + +       |
|    o . S        |
|   . = .         |
|  . B +          |
| . * = o         |
|+ o . = .        |
+----[SHA256]-----+

現在你已經理解了如何生成和管理SSH金鑰的基本方法。將生成的公鑰(id_ed25519_my_server.pubid_rsa.pub)註冊於遠端伺服器的~/.ssh/authorized_keys檔案中,即可安全地訪問而不需密碼。在下一篇文章中,我們將深入探討如何在伺服器上註冊和使用生成的SSH金鑰。

若有任何問題,隨時可以在留言中詢問!