一、為什麼使用公私鑰登入#
- 安全性更高
- 密碼複雜性問題:密碼登入通常需要用戶記住複雜的密碼,但很多人為了方便會選擇簡單密碼,這容易被暴力破解。而公私鑰登入使用的是非對稱加密技術,私鑰的長度通常較長(如 4096 位),破解難度極大。(公網中暴露 22 端口的 ssh 服務每天都會收到大量爆破密碼的登入請求,我查看日誌每天都有上千次)
- 防止中間人攻擊:公私鑰認證機制在加密過程中可以有效防止中間人攻擊。即使攻擊者截獲了通信內容,也無法獲取私鑰或解密數據。
- 無密碼洩露風險:在公私鑰登入過程中,私鑰始終保存在本地,不會像密碼登入那樣通過網絡傳輸,因此不存在密碼在傳輸過程中被截獲的風險。
- 登入更便捷
- 無需手動輸入密碼:一旦配置好公私鑰登入,用戶無需手動輸入密碼即可快速登入伺服器,大大提高了工作效率,尤其適合頻繁登入伺服器的場景。
- 支持多台伺服器:可以將同一個公鑰添加到多台伺服器上,使用同一對密鑰登入多台伺服器,簡化了登入過程。(但同時如果私鑰文件丟失或洩露,也會發生連鎖反應)
- 自動化操作:公私鑰登入支持無密碼登入,便於實現自動化腳本操作(使用 python fabric 庫自動部署),例如通過 SSH 執行遠程命令、文件傳輸等。
- 可擴展性強
- 易於管理:公鑰可以方便地分發給多台伺服器,而私鑰只需在本地妥善保管。如果需要更換密鑰,只需重新生成密鑰對並將新的公鑰上傳到伺服器即可。
二、生成密鑰對#
要想使用公私鑰登入伺服器首先需要生成密鑰對,可以在本地計算機使用 ssh-keygen
命令生成密鑰對。
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
- 生成密鑰對命令,
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 保存的遠程連接信息創建的,包含別名和主機名等。
- 簡化連接操作
在上述 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
。
三、將公鑰上傳到伺服器#
- 將公鑰內容複製到剪貼板
cat ~/.ssh/id_rsa.pub
選擇輸出內容複製。
-
登入伺服器,使用密碼或者其他方式
在伺服器上,家目錄~下創建
.ssh
目錄(如果不存在),並修改權限。mkdir -p ~/.ssh chmod 700 ~/.ssh
使用 vi 或者 vim 創建~/.ssh/authorized_keys。
vim ~/.ssh/authorized_keys
粘貼公鑰並保存。
-
修改伺服器 ssh 配置
編輯
/etc/ssh/sshd_config
文件。vim /etc/ssh/sshd_config
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
允許公鑰驗證和指定公鑰文件。
PermitRootLogin
設置為prohibit-password
或without-password
,禁用 root 用戶的密碼登入,僅允許公鑰登入。
-
重啟 sshd 服務使配置生效(也可使用舊命令
service
)。sudo systemctl sshd restart
-
登入測試
例如在本地計算機終端輸入,server_ip 是伺服器 ip(如果根據上面在 config 配置了別名,也可使用別名登入)。
ssh root@server_ip
本地如果是首次登入會顯示警告,輸入 yes 即可。
不出意外會直接登入伺服器,也是相當便捷。