原理簡介SSH證書認(rèn)證登錄的基礎(chǔ)是一對(duì)唯一匹配密鑰: 私鑰(private key)和公鑰(public key)。公鑰用于對(duì)數(shù)據(jù)進(jìn)行加密,而且只能用于加密。而私鑰只能對(duì)使用所匹配的公鑰,所加密過的數(shù)據(jù)進(jìn)行解密。私鑰需要用戶單獨(dú)妥善保管。SSH 客戶端使用私鑰向服務(wù)器證明自已的身份。而公鑰是公開的,可以按需將其配置到目標(biāo)服務(wù)器上自己的相應(yīng)賬號(hào)中。 在進(jìn)行 SSH 登錄認(rèn)證時(shí),進(jìn)行私鑰和公鑰協(xié)商。如果匹配,則身份得以證明,認(rèn)證成功,允許登錄。否則,將會(huì)繼續(xù)使用密碼驗(yàn)證等其它方式進(jìn)行登錄校驗(yàn)。SSH 證書驗(yàn)證登錄配置及登錄協(xié)商過程,如下證書校驗(yàn)交互登錄流程示意圖所示: 
各步驟補(bǔ)充說明如下:
生成證書- 客戶端生成密鑰對(duì)。
- 將公鑰信息寫入目標(biāo)服務(wù)器、目標(biāo)賬戶的配置文件。該操作隱含表示了客戶端擁有對(duì)目標(biāo)服務(wù)器的控制權(quán)。
協(xié)商交互過程-
客戶端向目標(biāo)服務(wù)器發(fā)送登錄請(qǐng)求。在SSH 服務(wù)啟用了證書驗(yàn)證登錄方式后,會(huì)優(yōu)先通過證書驗(yàn)證方式進(jìn)行登錄驗(yàn)證。 - 目標(biāo)服務(wù)器根據(jù) SSH 服務(wù)配置,在用戶對(duì)應(yīng)目錄及文件中讀取到有效的公鑰信息。
-
目標(biāo)服務(wù)器生成一串隨機(jī)數(shù),然后使用相應(yīng)的公鑰對(duì)其加密。 -
目標(biāo)服務(wù)器將加密后的密文發(fā)回客戶端。 -
客戶端使用默認(rèn)目錄或 -i 參數(shù)指定的私鑰嘗試解密。 -
如果解密失敗,則會(huì)繼續(xù)嘗試密碼驗(yàn)證等其它方式進(jìn)行登錄校驗(yàn)。如果解密成功,則將解密后的原文信息重新發(fā)送給目標(biāo)服務(wù)器。意思類似于: “看,這是這段話的原文。我能讀懂發(fā)過來的密文,我擁有服務(wù)器的控制權(quán),請(qǐng)讓我登錄。” -
目標(biāo)服務(wù)器對(duì)客戶端返回的信息進(jìn)行比對(duì)。如果比對(duì)成功,則表示認(rèn)證成功,客戶端可以登錄。如果對(duì)比失敗,則表示認(rèn)證失敗,則會(huì)繼續(xù)嘗試密碼驗(yàn)證等其它方式進(jìn)行登錄校驗(yàn)。
自動(dòng)登錄配置
- 生成密鑰對(duì)
- 密鑰配置
- 參數(shù)與權(quán)限檢查確認(rèn)
生成密鑰對(duì)
SSH 協(xié)議 V1只使用 RSA 算法,而 SSH 協(xié)議V2 對(duì) RSA 算法和 DSA 算法都支持。目前所有OpenSSH 版本都應(yīng)該對(duì)兩種算法都支持。兩種算法的密鑰的生成指令和使用方法相同,本文僅以 RSA 算法為例進(jìn)行相關(guān)說明。 生成密鑰對(duì)的時(shí)候,可以按需決定是否設(shè)置密碼。但需要注意的是,如果設(shè)置了密碼,還需結(jié)合 ssh-agent 代理和 ssh-add 配置才能實(shí)現(xiàn)自動(dòng)登錄。同時(shí),相關(guān)配置只對(duì) ssh-agent 啟動(dòng)的相應(yīng) shell 生效,用戶退出后重新登錄時(shí)還需重新配置。所以,為簡便起見,本文以常見的、不配置密碼的情況進(jìn)行說明。 可以在任意支持環(huán)境下生成密鑰對(duì)。Windows 和 Linux 環(huán)境下,配置分別說明如下。 - Windows 環(huán)境下生成密鑰對(duì)
- Linux 環(huán)境下生成密鑰對(duì)
Windows 環(huán)境下生成密鑰對(duì)在 Windows 環(huán)境下,通常借助各種應(yīng)用軟件來創(chuàng)建和管理密鑰對(duì)。以常見的NetSarang Xshell為例,請(qǐng)執(zhí)行如下步驟創(chuàng)建密鑰對(duì): - 打開Xshell程序。
- 單擊 工具 > 用戶密鑰管理者 ,再點(diǎn)擊 生成 。
- 在打開的密鑰創(chuàng)建向?qū)е?,選擇默認(rèn)的 RSA 密鑰算法及密鑰長度(默認(rèn) 2048 位)后,點(diǎn)擊 下一步 。
- 程序生成密鑰對(duì)后,點(diǎn)擊 下一步。
- 如前面所述,密鑰加密密碼留空:
 - 點(diǎn)擊 下一步,會(huì)彈出確認(rèn)信息,點(diǎn)擊 是 確認(rèn)。
- 復(fù)制或者點(diǎn)擊 保存為文件 對(duì)公鑰信息進(jìn)行保存。
- 點(diǎn)擊 完成 ,在 用戶密鑰管理者 列表中能看到相應(yīng)的密鑰信息。
Linux 環(huán)境下生成密鑰對(duì)在 Linux 環(huán)境下,通常使用系統(tǒng)自帶的 ssh-keygen 軟件來創(chuàng)建和管理密鑰對(duì)。請(qǐng)執(zhí)行如下步驟創(chuàng)建密鑰對(duì): - 以任意具有 ssh-keygen 執(zhí)行權(quán)限的用戶登錄服務(wù)器。
- 使用如下指令,基于 rsa 算法創(chuàng)建密鑰對(duì):
ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): → 默認(rèn)保存路徑和文件名,可以按需修改。 Enter passphrase (empty for no passphrase): → 如前面所述,不設(shè)置密碼,回車確認(rèn)即可。 Enter same passphrase again: → 不設(shè)置密碼,回車確認(rèn)即可。 Your identification has been saved in /root/.ssh/id_rsa. → 創(chuàng)建的私鑰文件。 Your public key has been saved in /root/.ssh/id_rsa.pub. → 創(chuàng)建的公鑰文件。 The key fingerprint is: 17:b8:0e:76:cb:57:21:3b:f2:bb:8b:a2:42:2b:54:be root@iZ233gr74jvZ The key's randomart image is: +--[ RSA 2048]----+ | | | . | | . o . | | . . + . | | o o S + . | | ... . = = o | |.. .. + o | |. oE . o . | | . ... .. +o | +-----------------+
說明:
密鑰配置
生成密鑰對(duì)后,進(jìn)行如下處理:
私鑰的處理私鑰用于信息校驗(yàn),請(qǐng)確保安全??梢詫⑺借€上傳到其它源服務(wù)器上,或者直接參閱前述說明創(chuàng)建新的密鑰對(duì)。
公鑰的處理公鑰信息需要寫入目標(biāo)服務(wù)器、目標(biāo)用戶的配置文件中,默認(rèn)配置文件為對(duì)應(yīng)用戶家目錄下 .ssh 文件夾中的 authorized_keys,即: ~/.ssh/authorized_keys
可以復(fù)制公鑰信息后,直接通過 vi 等編輯器將其寫入上述文件?;蛘咄ㄟ^如下指令,在源服務(wù)器上配置寫入: cat ~/.ssh/id_rsa.pub | ssh <用戶名>@<目標(biāo)服務(wù)器IP> 'cat >> ~/.ssh/authorized_keys';
比如: cat ~/.ssh/id_rsa.pub | ssh root@120.26.38.248 'cat >> ~/.ssh/authorized_keys';
注意:
參數(shù)與權(quán)限檢查確認(rèn)
要順利完成自動(dòng)登錄,還需對(duì)SSH 服務(wù)相關(guān)參數(shù)及關(guān)聯(lián)文件、文件夾的權(quán)限進(jìn)行確認(rèn)或調(diào)整。
SSH 服務(wù)參數(shù)設(shè)置SSH 服務(wù)默認(rèn)開啟了證書認(rèn)證支持。編輯 SSH 服務(wù)配置文件(默認(rèn)為/etc/ssh/sshd_config),確保如下參數(shù)沒有顯示的置為 no。否則,將參數(shù)值修改為 yes,或者整個(gè)刪除或注釋(在最開頭添加 # 號(hào))整行配置。比如: #RSAAuthentication yes #PubkeyAuthentication yes
同時(shí),如前面所述,如果修改了默認(rèn)的公鑰路徑或文件名,還需確保 AuthorizedKeysFile 參數(shù)值配置的信息與其一致。 注意:如果對(duì)相關(guān)參數(shù)做了修改,需要重啟 SSH 服務(wù)生效。
相關(guān)權(quán)限設(shè)置SSH 服務(wù)證書驗(yàn)證方式登錄,對(duì)相關(guān)目錄和文件的權(quán)限有要求。權(quán)限配置異常可能會(huì)導(dǎo)致登錄失敗。 自動(dòng)登錄
完成上述配置后,在客戶端即可免密碼直接登錄。說明如下: - Windows 環(huán)境自動(dòng)登錄
- Linux 環(huán)境自動(dòng)登錄
Windows 環(huán)境自動(dòng)登錄Window 環(huán)境下,還是以常見的NetSarang Xshell為例,請(qǐng)執(zhí)行如下配置進(jìn)行自動(dòng)登錄: - 單擊 文件 > 屬性,打開主機(jī)屬性配置窗口。
- 點(diǎn)擊 連接 > 用戶身份驗(yàn)證,如下圖所示,將 方法 設(shè)置為 Public Key;將 用戶名 設(shè)置為已經(jīng)設(shè)置了證書登錄的相應(yīng)用戶名;將 用戶密鑰 設(shè)置為對(duì)應(yīng)的私鑰。最后,點(diǎn)擊 確定。
 - 再次連接相應(yīng)服務(wù)器時(shí),無需密碼輸入用戶名和密碼,即可自動(dòng)登錄。
Linux 環(huán)境自動(dòng)登錄Linux 環(huán)境下,在客戶端直接通過 ssh 軟件免密碼登錄: ssh <用戶名>@<目標(biāo)服務(wù)器>
比如: ssh root@192.168.0.1
如果修改了私鑰路徑或文件名,則需要通過 –i 參數(shù)進(jìn)行指定: ssh –i <私鑰路徑及文件名> <用戶名>@<目標(biāo)服務(wù)器>
比如: ssh -i /bak/my_rsa user@192.168.0.1
|