在 Windows 使用「非對稱金鑰」來遠端登入 SSH 的方法
在 Linux Server 下使用 SSH 的「非對稱金鑰」來進行遠端登入的方式相信大家應該都不陌生 (沒實做過的可參考鳥哥或 study-area 的文件),下面我所要介紹的是在 Windows 下使用金鑰來遠端登入 SSH 的方法。
開始之前,先說一下「非對稱金鑰」:
「非對稱金鑰」是一種加密機制,由用戶端以特定的加密演演算法產生兩把「非對稱」金鑰: 即「公鑰 (Public-Key)」與「私鑰 (Private-Key)」。然後我們會把「私鑰」留在自己的電腦,再把「公鑰」傳送到遠端主機,當兩把金鑰碰在一起就會進行加解密比對,以確認是否彼此的身份是可以信任的,藉以執行特定的作業。
說得更簡單一點,與其說是「公鑰」與「私鑰」,不如說是「鎖頭」與「鑰匙」,由我自己來打造一組鎖頭及鑰匙,我把這個鎖頭裝在一個門上,然後我就可以用我的這一把鑰匙來打開這扇門了! 同時呢,我也可以把相同的鎖頭裝在很多的門上,那我就可以用這一把鑰匙來開啟很多門了…這樣子的概念是否有比較清楚了呢?!
以下我們的目的是要用「非對稱金鑰系統」的機制,從 Windows 登入 Linux 主機,下面的步驟所要使用的軟體都是由 PuTTY 所提供的工具程式,請先下載存放在自己的電腦:
產生公鑰與私鑰
執行 puttygen.exe:
- 先在 Parameters 的「Type of key to generate」欄位選「SSH-2 DSA」。
- 如果你希望加密更多的位元數,可更改「Number of bits in a generated key」為「2048」或更多。
- 然後按 [Generate],就會開始產生金鑰。在產生金鑰的同時,請隨意移動你的滑鼠,做為隨機亂數的取用。
金鑰產生完畢,如下圖所示:
- 在「Public key for pasting into OpenSSH authorized_keys file」裡那一堆的奇怪的字串就是「公鑰」,請直接複製裡面的內容,然後貼到 Linux 主機上的 /home/登入帳號/.ssh/authorized_keys 檔案 (請注意,這個檔案的權限必須為 644)。
- 然後按 [Save private key] 按鈕,將「私鑰」儲存在你的電腦。與私鑰比較有關的是「Key passphrase」及「Confirm passphrase」這兩個欄位,這兩個欄位是用來設定私鑰的密碼,如果有設定的話,在每次要載入私鑰時就會詢問你這個密碼,可以讓你的私鑰比較不容易被盜用。
- 另外還有一個 [Save public key],按下去之後就可以把「公鑰」再備份一支到你的電腦 (但要使用這個備份的公鑰時,必須把裡面的一些註解刪掉才行)。
使用私鑰進行遠端登入
產生完上面的兩把金鑰,並將公鑰放到遠端的主機之後,接下來就是如何在本地端載入私鑰的問題了。因為 Windows 並不像 Linux 有一個固定存放私鑰的地方,所以每次使用時都要各別載入,而且通常只能載入一個 (例如 PieTTY 是從 [選項] → [詳細設定] → Connection → SSH → Auth 裡的「Private key file for authentication」載入),並且只能在該程式使用。
所以接下來我們要執行 pageant.exe,這是「私鑰」的代理程式,一執行這個程式,他會常駐在工作列的「通知區」,請在 pageant 的圖示上點滑鼠右鍵選「Add Key」,將你的私鑰檔案載入。
在加私鑰時,如果你有設定「Key passphrase」,它就會跳出對話框叫你輸入密碼。這個代理程式可以同時讓你載入很多私鑰,並且所有同類型的程式都可以直接使用。
現在你就可以用你常用的 SSH 程式 (PieTTY, PuTTY…) 來登入到 Linux 主機看看,正確的話,只要輸入帳號,不用再打密碼就可以登入了。
補充…
使用 TortoiseSVN 配合 SSH
如果你有在使用 SVN 的話 (假設 SVN Server 是架在 Linux 主機,用戶端為 Windows,用戶端有安裝 TortoiseSVN),剛好 TortoiseSVN 就有提供 SVN + SSH 的通訊協定來傳輸資料。
如果你的專案是以 SVN + SSH 做為通訊協定,每次你在執行任何 TortoiseSVN 的傳輸動作時,它就會不厭其煩的跟你詢問遠端主機的密碼。
如果想要依照「非對稱金鑰」來與 Linux 主機做登入驗證,則你需要到 TortoiseSVN 的參數設定裡的「Dialogs 2」將「Recurse into unversioned folders」及「Contact the repository on startup」這兩個選項都打勾,如下圖所示:
這樣應該就可以解決密碼詢問的問題了。
No comments yet.