MIS 腳印 logo

MIS 腳印

記錄 IT 學習的軌跡

Windows 使用 SSH 金鑰免密碼登入 Linux

如何透過 Linux 建立的公開金鑰加密 (非對稱金鑰加密),提供 Windows 7/8/10 使用 SSH Private Key 讓 PuTTY、PieTTY、WinSCP 軟體,以及 OpenSSH Client 免密碼登入 Linux。

SSH
【Visual Studio Code 使用 Remote - SSH 金鑰免密碼開啟遠端 Linux 資料夾】專題系列文章
Visual Studio Code 使用 Remote - SSH 開啟遠端 Linux 資料夾

原理

透過公開金鑰加密 (Public-key cryptography) 或稱「非對稱金鑰加密」的兩把加解密鑰匙 Public Key (公鑰) 和 Private Key (私鑰),取代 Client 使用 SSH (Secure Shell,安全殼協議) 協定連結 Server 登入時必須輸入驗證密碼的動作:

  1. Public Key:存放於 Server,路徑與檔名必須依據 /etc/ssh/sshd_config 內的 AuthorizedKeysFile 定義來設定。
  2. Private Key:存放於 Client,用來解密 Server 的 Public Key,因此只要誰擁有 Private Key 就能夠 SSH 連結且免密碼直接登入 Server,所以 Private Key 非常重要,不可外流。

系統環境

  • Server:Linux (CentOS 7)。
  • Client:Windows 7 / 10。

Linux (Server)

建立金鑰

以當前登入身份建立金鑰,預設會在家目錄下的 .ssh/ 產生這兩把金鑰檔 :

ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/jacky/.ssh/id_rsa):  # 儲存金鑰路徑和檔名,使用預設直接 Enter
Created directory '/home/jacky/.ssh'.                           # 產生 .ssh 目錄
Enter passphrase (empty for no passphrase):                     # 不建立密碼,直接 Enter
Enter same passphrase again:                                    # 密碼確認,直接 Enter
Your identification has been saved in /home/jacky/.ssh/id_rsa.  # Private Key 存放路徑
Your public key has been saved in /home/jacky/.ssh/id_rsa.pub.  # Public Key 存放路徑
The key fingerprint is:
SHA256:P9W8LMj/6qQDHBdGFTwywEMA+6NXjf4XzNbPgk0///U jacky@mes.xxx.com.tw
The key's randomart image is:
+---[RSA 2048]----+
|    ...+oo.oo.   |
|     .  o = o    |
|    .    o + .   |
|     .  .o.  o   |
|      o.So.o..o  |
|     . +oo o=.o. |
|    . . ..=.o=o+.|
|     .   ..=o.o.*|
|          o++o..E|
+----[SHA256]-----+

Public Key 路徑與檔名

Public Key 儲放的路徑與檔名必須依據 /etc/ssh/sshd_config 內的 AuthorizedKeysFile 定義來設定:

sudo cat /etc/ssh/sshd_config | grep AuthorizedKeysFile
AuthorizedKeysFile      .ssh/authorized_keys

依 /etc/ssh/sshd_config 設定檔更改 Public Key 檔名:

mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys

權限

建立的兩把金鑰,雖然預設的權限就都是正確的了,但還是有必要了解一些規則,因為只要一個設定有誤,就可能會被判定為危險,而造成 Public Key 和 Private Key 無法順利比對:

  • ~/.ssh/ (目錄):權限必須為 700 (drwx------)。
  • ~.ssh/authorized_keys (Public Key)
    • 權限必須為 644 (-rw-r--r--)。
    • 擁有者必須屬於本身帳戶才行。

檢查權限設定:

ls -ld ~/.ssh; ls -l ~/.ssh
drwx------. 2 jacky jacky 43 12月  7 06:17 /home/jacky/.ssh
總計 8
-rw-r--r--. 1 jacky jacky  405 12月  7 06:00 authorized_keys
-rw-------. 1 jacky jacky 1831 12月  7 06:00 id_rsa

Windows (Client)

取得 Private Key

使用 WinSCP 連結 Linux,取得在 Linux 產生的 Private Key。

使用 Private Key SSH 連結 Linux

軟體

在 Windows 要讓 PuTTYPieTTY 或 WinSCP ... 軟體可使用 Private Key 來 SSH 連結 Linux,必須先透過 PuTTYgen 將在 Linux 產生的 Private Key 轉換成 Windows 系統可識別的 *.ppk 才可正常使用。

選擇要轉換成 *.ppk 的 Private Key 檔:

儲存轉換成 *.ppk 的 Private Key:

自訂檔名,但副檔名必須為 *.ppk:

OpenSSH Client

Windows 也是透過和 Linux 相同的 OpenSSH,因此不須像軟體還要轉換在 Linux 產生的 Private Key 即可直接使用。

執行 ssh 指令時會自動到使用者家目錄的 .ssh/ 目錄下尋找有無可用的 Private Key,因此我們要將 Private Key 移到這:

開啟 CMD 執行指令 ssh + 登入帳戶 + @ + Server 位址,即可免密碼直接登入 Linux Server:

ssh jacky@220.xxx.84.xxx
The authenticity of host '[220.xxx.84.xxx]:22 ([220.xxx.84.xxx]:22)' can't be established.
ECDSA key fingerprint is SHA256:d2UxxxxxgbE1/xxxxxQ7MrZxxxxx8EtcfxxxxxN/Y/Y.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[220.xxx.84.xxx]:22' (ECDSA) to the list of known hosts.
Web console: https://mes.xxx.com.tw:9090/ or https://192.168.1.232:9090/

Last login: Sat Dec  7 06:34:47 2019 from 61.xxx.180.xxx
[jacky@localhost ~]$

如有多個 Private Key 可使用 -i 參數指定要使用的 Private Key 檔:

ssh jacky@220.xxx.84.xxx -i C:\Users\%USER%\Desktop\id_rsa

如果不是使用 SSH 預設的 22 port,可使用 -p 參數指定 port:

ssh jacky@220.xxx.84.xxx-p 3222

參考

發表迴響