SSH 密鑰認證



前面介紹cygwin下安裝sshd時簡單地提到了ssh的公鑰認證。下面將這種認證方式詳細地解釋一下。

    * 爲什麼要使用公鑰認證
    * 公鑰認證的原理
    * 服務器端設置
    * 客戶端設置
          o Linux
          o Windows
                + 使用Linux下生成的公鑰和密鑰的情況
                + 使用puttygen生成公鑰和密鑰
                + 設置 putty 使用公鑰認證

爲什麼要使用公鑰認證

通常,通過ssh登錄遠程服務器時,使用密碼認證,分別輸入用戶名和密碼,兩者滿足一定規則就可以登錄。但是密碼認證有以下的缺點:

    * 用戶無法設置空密碼(即使系統允許空密碼,也會十分危險)
    * 密碼容易被人偷窺或猜到
    * 服務器上的一個帳戶若要給多人使用,則必須讓所有使用者都知道密碼,導致密碼容易泄露,而且修改密碼時必須通知所有人

而使用公鑰認證則可以解決上述問題。

    * 公鑰認證允許使用空密碼,省去每次登錄都需要輸入密碼的麻煩
    * 多個使用者可以通過各自的密鑰登錄到系統上的同一個用戶

公鑰認證的原理

所謂的公鑰認證,實際上是使用一對加密字符串,一個稱爲公鑰(public key),任何人都可以看到其內容,用於加密;另一個稱爲密鑰(private key),只有擁有者才能看到,用於解密。通過公鑰加密過的密文使用密鑰可以輕鬆解密,但根據公鑰來猜測密鑰卻十分困難。

ssh 的公鑰認證就是使用了這一特性。服務器和客戶端都各自擁有自己的公鑰和密鑰。爲了說明方便,以下將使用這些符號。
Ac    客戶端公鑰
Bc    客戶端密鑰
As    服務器公鑰
Bs    服務器密鑰

在認證之前,客戶端需要通過某種方法將公鑰 Ac 登錄到服務器上。

認證過程分爲兩個步驟。

   1. 會話密鑰(session key)生成
         1. 客戶端請求連接服務器,服務器將 As 發送給客戶端。
         2. 服務器生成會話ID(session id),設爲 p,發送給客戶端。
         3. 客戶端生成會話密鑰(session key),設爲 q,並計算 r = p xor q。
         4. 客戶端將 r 用 As 進行加密,結果發送給服務器。
         5. 服務器用 Bs 進行解密,獲得 r。
         6. 服務器進行 r xor p 的運算,獲得 q。
         7. 至此服務器和客戶端都知道了會話密鑰q,以後的傳輸都將被 q 加密。
   2. 認證
         1. 服務器生成隨機數 x,並用 Ac 加密後生成結果 S(x),發送給客戶端
         2. 客戶端使用 Bc 解密 S(x) 得到 x
         3. 客戶端計算 q + x 的 md5 值 n(q+x),q爲上一步得到的會話密鑰
         4. 服務器計算 q + x 的 md5 值 m(q+x)
         5. 客戶端將 n(q+x) 發送給服務器
         6. 服務器比較 m(q+x) 和 n(q+x),兩者相同則認證成功

服務器端設置

使用公鑰認證需要對服務器進行一些設置。修改 /etc/sshd_config 的以下配置。

RSAAuthentication yes        # 啓用 RSA 認證
PubkeyAuthentication yes     # 啓用公鑰認證
PasswordAuthentication no    # 禁止密碼認證

然後重新啓動 sshd。

/etc/init.d/ssh restart

客戶端設置
Linux

假設客戶端的用戶 charlee 要以 guest 用戶登錄到服務器上。首先在客戶端執行下面的命令。

[charlee@client:~]$ ssh-keygen -t rsa
Generating public/private rsa1 key pair.
Enter file in which to save the key (/home/charlee/.ssh/id_rsa):
Enterpassphrase (empty for no passphrase):  輸入密碼
Enter same passphrase again:   再次輸入密碼
Your identification has been sabed in /home/charlee/.ssh/id_rsa
Your public key has been saved in /home/charlee/.ssh/id_rsa.pub

生成的文件保存在主目錄的 .ssh 目錄下,id_rsa爲客戶端密鑰,id_rsa.pub 爲客戶端公鑰。

之後,通過 U 盤等方式將公鑰 id_rsa.pub 複製到服務器上,並執行下列命令。

[guest@server:~]$ cat id_rsa.pub >> .ssh/authorized_keys

其中 id_rsa.pub 是客戶端的用戶 charlee 的公鑰。

這樣在客戶端即可通過以下的命令連接服務器。

[charlee@client:~]$ ssh -l guest server

若不想每次登錄服務器時都輸入密碼,可以先執行下列命令:

[charlee@client:~]$ ssh-add
Enter passphrase for /home/charlee/.ssh/id_rsa: 輸入密碼
Identity added: /home/charlee/.ssh/id_rsa (/home/charlee/.ssh/id_rsa)

以後登錄服務器就不需要輸入密碼了。
Windows

假設我們使用putty連接ssh服務器。爲了使用公鑰認證,我們需要同時下載 puttygen 這個工具來生成 putty 所使用的密鑰。
使用Linux下生成的公鑰和密鑰的情況

如果你按照上面的介紹,在Linux下生成了公鑰和密鑰的話,那麼需要利用 puttygen 將密鑰轉換成 putty 使用的格式。

將Linux下生成的密鑰 id_rsa 複製到 Windows 下。啓動 puttygen,然後單擊Load按鈕,選擇文件類型爲所有文件,然後選擇 id_rsa,打開。若在生成密鑰時輸入了密碼,則打開時需要輸入該密碼。之後就可以在 puttygen 的主界面上單擊 Save private key,保存成 putty 格式的密鑰。
使用puttygen生成公鑰和密鑰

你也可以利用 puttygen 直接生成公鑰和密鑰。打開 puttygen,然後在畫面下方的 Parameters 欄選擇加密算法和加密長度(一般取默認值即可),最後單擊 Generate。畫面上會出現一個進度條,在界面上隨意移動鼠標以生成隨機數。最後提示生成結束,單擊 Save private key 按鈕保存密鑰。最後將上方的Public key for pasting into OpenSSH authorized_keys file欄中的內容複製到 Linux 下用戶主目錄下的 ~/.ssh/authorized_keys 文件中。
設置 putty 使用公鑰認證

先在putty中設置好連接的主機名、端口等信息(說明省略)。使用公鑰認證需要設置兩個地方:一個是 Connection 中的 Auto-login username,輸入在服務器上的用戶名;另一個是 Connection->SSH->Auth中的 Private key file for authentication,選擇剛纔轉換或生成的 .ppk 格式的密鑰。之後即可使用公鑰認證進行連接了。
 
 
 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章