Lolik

not404

nothing
x
bilibili
github
telegram
steam
follow

如何使用公私鑰登錄Linux伺服器

一、為什麼使用公私鑰登入#

  1. 安全性更高
  • 密碼複雜性問題:密碼登入通常需要用戶記住複雜的密碼,但很多人為了方便會選擇簡單密碼,這容易被暴力破解。而公私鑰登入使用的是非對稱加密技術,私鑰的長度通常較長(如 4096 位),破解難度極大。(公網中暴露 22 端口的 ssh 服務每天都會收到大量爆破密碼的登入請求,我查看日誌每天都有上千次)
  • 防止中間人攻擊:公私鑰認證機制在加密過程中可以有效防止中間人攻擊。即使攻擊者截獲了通信內容,也無法獲取私鑰或解密數據。
  • 無密碼洩露風險:在公私鑰登入過程中,私鑰始終保存在本地,不會像密碼登入那樣通過網絡傳輸,因此不存在密碼在傳輸過程中被截獲的風險。
  1. 登入更便捷
  • 無需手動輸入密碼:一旦配置好公私鑰登入,用戶無需手動輸入密碼即可快速登入伺服器,大大提高了工作效率,尤其適合頻繁登入伺服器的場景。
  • 支持多台伺服器:可以將同一個公鑰添加到多台伺服器上,使用同一對密鑰登入多台伺服器,簡化了登入過程。(但同時如果私鑰文件丟失或洩露,也會發生連鎖反應)
  • 自動化操作:公私鑰登入支持無密碼登入,便於實現自動化腳本操作(使用 python fabric 庫自動部署),例如通過 SSH 執行遠程命令、文件傳輸等。
  1. 可擴展性強
  • 易於管理:公鑰可以方便地分發給多台伺服器,而私鑰只需在本地妥善保管。如果需要更換密鑰,只需重新生成密鑰對並將新的公鑰上傳到伺服器即可。

二、生成密鑰對#

要想使用公私鑰登入伺服器首先需要生成密鑰對,可以在本地計算機使用 ssh-keygen 命令生成密鑰對。

  1. ssh-keygen命令需要安裝 OpenSSH 客戶端

以 Windows11 為例,在設定 > 系統 > 可選功能 搜索 OpenSSH 安裝客戶端,使用powershell查看是否安裝

> gcm ssh-keygen

CommandType     Name                 Version    Source
-----------     ----                 -------    ------
Application     ssh-keygen.exe       9.5.3.1    C:\Windows\System32\OpenSSH\ssh-keygen.exe
  1. 生成密鑰對命令,
ssh-keygen -t rsa -b 4096
  • -t rsa:指定密鑰類型為 RSA。
  • -b 4096:指定密鑰長度為 4096 位,更高的密鑰長度意味著更強的安全性。

回車後會提示你輸入保存密鑰的文件路徑和可選的密碼,不需要密碼直接按回車跳過即可。

默認情況下,密鑰會保存在 ~/.ssh/id_rsa(私鑰)和 ~/.ssh/id_rsa.pub(公鑰),在 Windows 上一般在C:\Users\<用戶名>\.ssh下,例如在我這裡

24123@lolik ~\.ssh
> ls
    目錄: C:\Users\24123\.ssh
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         2025/2/19     10:03            210 config
-a----          2024/6/7     14:43           3381 id_rsa
-a----          2024/6/7     14:43            738 id_rsa.pub
-a----         2025/2/19      9:57           5828 known_hosts
-a----         2025/2/19      9:52           5080 known_hosts.old

known_hosts 可能保存著連接過的伺服器公鑰,我的 config 是 vs code 保存的遠程連接信息創建的,包含別名和主機名等。

  1. 簡化連接操作

在上述 config 文件中(沒有可以自己創建),例如:

# Read more about SSH config files: https://linux.die.net/man/5/ssh_config
  Host winserverA
    HostName 1.1.1.1
    User administrator
    IdentityFile ~/.ssh/id_rsa

  Host serverB
    HostName 1.1.1.1
    User root
    IdentityFile ~/.ssh/id_rsa
  • Host:為伺服器設置一個別名,方便記憶。

  • HostName:伺服器的 IP 地址。

  • User:伺服器的用戶名。

  • IdentityFile:私鑰文件路徑。

    IdentityFile 似乎默認是 ~/.ssh/id_rsa

    因為我使用ssh 別名ssh username@ip 命令可以直接登入,沒有指定-i ~/.ssh/id_rsa

三、將公鑰上傳到伺服器#

  1. 將公鑰內容複製到剪貼板
cat ~/.ssh/id_rsa.pub

​ 選擇輸出內容複製。

  1. 登入伺服器,使用密碼或者其他方式

    在伺服器上,家目錄~下創建 .ssh 目錄(如果不存在),並修改權限。

    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
    

    使用 vi 或者 vim 創建~/.ssh/authorized_keys。

    vim  ~/.ssh/authorized_keys
    

    粘貼公鑰並保存。

  2. 修改伺服器 ssh 配置

    編輯/etc/ssh/sshd_config文件。

    vim /etc/ssh/sshd_config
    
    • PubkeyAuthentication yes
    • AuthorizedKeysFile .ssh/authorized_keys

​ 允許公鑰驗證和指定公鑰文件。

  • PermitRootLogin 設置為 prohibit-passwordwithout-password,禁用 root 用戶的密碼登入,僅允許公鑰登入。
  1. 重啟 sshd 服務使配置生效(也可使用舊命令service)。

    sudo systemctl sshd restart
    
  2. 登入測試

    例如在本地計算機終端輸入,server_ip 是伺服器 ip(如果根據上面在 config 配置了別名,也可使用別名登入)。

    ssh root@server_ip          
    

    本地如果是首次登入會顯示警告,輸入 yes 即可。

    不出意外會直接登入伺服器,也是相當便捷。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。