手把手教你!SSH 證書登陸教程

來自:阮一峯的網絡日誌
連接:https://tinyurl.com/yc9xrc7t

SSH 是服務器登陸工具,提供密碼登陸和密鑰登陸。算法

可是,SSH 還有第三種登陸方法,那就是證書登陸。不少狀況下,它是更合理、更安全的登陸方法,本文就介紹這種登陸方法。安全

1、非證書登陸的缺點

密碼登陸和密鑰登陸,都有各自的缺點。服務器

密碼登陸須要輸入服務器密碼,這很是麻煩,也不安全,存在被暴力破解的風險。網絡

密鑰登陸須要服務器保存用戶的公鑰,也須要用戶保存服務器公鑰的指紋。這對於多用戶、多服務器的大型機構很不方便,若是有員工離職,須要將他的公鑰從每臺服務器刪除。app

2、證書登陸是什麼?

證書登陸就是爲了解決上面的缺點而設計的。它引入了一個證書頒發機構(Certificate1 authority,簡稱 CA),對信任的服務器頒發服務器證書,對信任的用戶頒發用戶證書。ssh

登陸時,用戶和服務器不須要提早知道彼此的公鑰,只須要交換各自的證書,驗證是否可信便可。ide

證書登陸的主要優勢有兩個:(1)用戶和服務器不用交換公鑰,這更容易管理,也具備更好的可擴展性。(2)證書能夠設置到期時間,而公鑰沒有到期時間。針對不一樣的狀況,能夠設置有效期很短的證書,進一步提升安全性。工具

3、證書登陸的流程

SSH 證書登陸以前,若是尚未證書,須要生成證書。具體方法是:(1)用戶和服務器都將本身的公鑰,發給 CA;(2)CA 使用服務器公鑰,生成服務器證書,發給服務器;(3)CA 使用用戶的公鑰,生成用戶證書,發給用戶。ui

有了證書之後,用戶就能夠登陸服務器了。整個過程都是 SSH 自動處理,用戶無感知。url

  • 第一步,用戶登陸服務器時,SSH 自動將用戶證書發給服務器。
  • 第二步,服務器檢查用戶證書是否有效,以及是否由可信的 CA 頒發。
  • 第三步,SSH 自動將服務器證書發給用戶。
  • 第四步,用戶檢查服務器證書是否有效,以及是否由信任的 CA 頒發。
  • 第五步,雙方創建鏈接,服務器容許用戶登陸。

4、生成 CA 的密鑰

證書登陸的前提是,必須有一個 CA,而 CA 本質上就是一對密鑰,跟其餘密鑰沒有不一樣,CA 就用這對密鑰去簽發證書。

雖然 CA 能夠用同一對密碼簽發用戶證書和服務器證書,可是出於安全性和靈活性,最好用不一樣的密鑰分別簽發。因此,CA 至少須要兩對密鑰,一對是簽發用戶證書的密鑰,假設叫作 user_ca,另外一對是簽發服務器證書的密鑰,假設叫作 host_ca。

使用下面的命令,生成 user_ca。

# 生成 CA 簽發用戶證書的密鑰  

$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/user\_ca -C user\_ca

上面的命令會在 ~/.ssh 目錄生成一對密鑰:user_ca(私鑰)和 user_ca.pub(公鑰)。

這個命令的各個參數含義以下。

  • -t rsa:指定密鑰算法 RSA。
  • -b 4096:指定密鑰的位數是4096位。安全性要求不高的場合,這個值能夠小一點,可是不該小於1024。
  • -f ~/.ssh/user_ca:指定生成密鑰的位置和文件名。
  • -C user_ca:指定密鑰的識別字符串,至關於註釋,能夠隨意設置。

使用下面的命令,生成 host_ca。

# 生成 CA 簽發服務器證書的密鑰
$ ssh-keygen -t rsa -b 4096 -f host_ca -C host_ca

上面的命令會在~/.ssh目錄生成一對密鑰:host_ca(私鑰)和 host_ca.pub(公鑰)。

如今,~/.ssh 目錄應該至少有四把密鑰。

  • ~/.ssh/user_ca
  • ~/.ssh/user_ca.pub
  • ~/.ssh/host_ca
  • ~/.ssh/host_ca.pub

5、CA 簽發服務器證書

有了 CA 之後,就能夠簽發服務器證書了。

簽發證書,除了 CA 的密鑰之外,還須要服務器的公鑰。通常來講,SSH 服務器(一般是sshd)安裝時,已經生成密鑰 /etc/ssh/ssh_host_rsa_key 了。若是沒有的話,能夠用下面`的命令生成。

$ sudo ssh-keygen -f /etc/ssh/ssh_host_rsa_key -b 4096 -t rsa

上面命令會在 /etc/ssh 目錄,生成 ssh_host_rsa_key(私鑰)和 ssh_host_rsa_key.pub(公鑰)。而後,須要把服務器公鑰 ssh_host_rsa_key.pub,複製或上傳到 CA 所在的服務器。

上傳之後,CA 就可使用密鑰 host_ca 爲服務器的公鑰 ssh_host_rsa_key.pub 簽發服務器證書。

$ ssh-keygen -s host_ca -I host.example.com -h -n host.example.com -V +52w ssh_host_rsa_key.pub

上面的命令會生成服務器證書 ssh_host_rsa_key-cert.pub(服務器公鑰名字加後綴-cert)。這個命令各個參數的含義以下。

  • -s:指定 CA 簽發證書的密鑰。
  • -I:身份字符串,能夠隨便設置,至關於註釋,方便區分證書,未來可使用這個字符串撤銷證書。
  • -h:指定該證書是服務器證書,而不是用戶證書。
  • -n host.example.com:指定服務器的域名,表示證書僅對該域名有效。若是有多個域名,則使用逗號分隔。用戶登陸該域名服務器時,SSH 經過證書的這個值,分辨應該使用哪張證書發給用戶,用來證實服務器的可信性。
  • -V +52w:指定證書的有效期,這裏爲 52 周(一年)。默認狀況下,證書是永遠有效的。建議使用該參數指定有效期,而且有效期最好短一點,最長不超過 52 周。
  • ssh_host_rsa_key.pub:服務器公鑰。

生成證書之後,可使用下面的命令,查看證書的細節。

$ ssh-keygen -L -f ssh_host_rsa_key-cert.pub

最後,爲證書設置權限。

$ chmod 600 ssh_host_rsa_key-cert.pub

6、CA 簽發用戶證書

下面,再用 CA 簽發用戶證書。這時須要用戶的公鑰,若是沒有的話,客戶端能夠用下面的命令生成一對密鑰。

$ ssh-keygen -f ~/.ssh/user_key -b 4096 -t rsa

上面命令會在 ~/.ssh 目錄,生成 user_key(私鑰)和 user_key.pub(公鑰)。

而後,將用戶公鑰 user_key.pub,上傳或複製到 CA 服務器。接下來,就可使用 CA 的密鑰 user_ca 爲用戶公鑰 user_key.pub 簽發用戶證書。

$ ssh-keygen -s user_ca -I user@example.com -n user -V +1d user_key.pub

上面的命令會生成用戶證書 user_key-cert.pub(用戶公鑰名字加後綴-cert)。這個命令各個參數的含義以下。

  • -s:指定 CA 簽發證書的密鑰
  • -I:身份字符串,能夠隨便設置,至關於註釋,方便區分證書,未來可使用這個字符串撤銷證書。
  • -n user:指定用戶名,表示證書僅對該用戶名有效。若是有多個用戶名,使用逗號分隔。用戶以該用戶名登陸服務器時,SSH 經過這個值,分辨應該使用哪張證書,證實本身的身份,發給服務器。
  • -V +1d:指定證書的有效期,這裏爲1天,強制用戶天天都申請一次證書,提升安全性。默認狀況下,證書是永遠有效的。
  • user_key.pub:用戶公鑰。

生成證書之後,可使用下面的命令,查看證書的細節。

$ ssh-keygen -L -f user_key-cert.pub

最後,爲證書設置權限。

$ chmod 600 user_key-cert.pub

7、服務器安裝證書

CA 生成服務器證書 ssh_host_rsa_key-cert.pub 之後,須要將該證書發回服務器,可使用下面的 scp 命令,將證書拷貝過去。

$ scp ~/.ssh/ssh_host_rsa_key-cert.pub root@host.example.com:/etc/ssh/

而後,將下面一行添加到服務器配置文件 /etc/ssh/sshd_config。

HostCertificate /etc/ssh/ssh_host_rsa_key-cert.pub

上面的代碼告訴 sshd,服務器證書是哪個文件。

從新啓動 sshd。

$ sudo systemctl restart sshd
# 或者
$ sudo service sshd restart

8、服務器安裝 CA 公鑰

爲了讓服務器信任用戶證書,必須將 CA 簽發用戶證書的公鑰 user_ca.pub,拷貝到服務器。

$ scp ~/.ssh/user_ca.pub root@host.example.com:/etc/ssh/

上面的命令,將 CA 簽發用戶證書的公鑰 user_ca.pub,拷貝到 SSH 服務器的 /etc/ssh 目錄。

而後,將下面一行添加到服務器配置文件 /etc/ssh/sshd_config。

TrustedUserCAKeys /etc/ssh/user_ca.pub

上面的作法是將 user_ca.pub 加到 /etc/ssh/sshd_config,這會產生全局效果,即服務器的全部帳戶都會信任 user_ca 簽發的全部用戶證書。

另外一種作法是將 user_ca.pub 加到服務器某個帳戶的 ~/.ssh/authorized_keys 文件,只讓該帳戶信任 user_ca 簽發的用戶證書。具體方法是打開 ~/.ssh/authorized_keys,追加一行,開頭是 @cert-authority principals="...",而後後面加上 user_ca.pub 的內容,大概是下面這個樣子。

@cert-authority principals="user" ssh-rsa AAAAB3Nz...XNRM1EX2gQ==

上面代碼中,principals="user" 指定用戶登陸的服務器帳戶名,通常就是 authorized_keys 文件所在的帳戶。

從新啓動 sshd。

$ sudo systemctl restart sshd
# 或者
$ sudo service sshd restart

至此,SSH 服務器已配置爲信任 user_ca 簽發的證書。

9、客戶端安裝證書

客戶端安裝用戶證書很簡單,就是從 CA 將用戶證書 user_key-cert.pub 複製到客戶端,與用戶的密鑰 user_key 保存在同一個目錄便可。

10、客戶端安裝 CA 公鑰

爲了讓客戶端信任服務器證書,必須將 CA 簽發服務器證書的公鑰 host_ca.pub,加到客戶端的 /etc/ssh/ssh_known_hosts 文件(全局級別)或者 ~/.ssh/known_hosts 文件(用戶級別)。

具體作法是打開 ssh_known_hosts 或 known_hosts 文件,追加一行,開頭爲 @cert-authority *.example.com,而後將 host_ca.pub 文件的內容(即公鑰)粘貼在後面,大概是下面這個樣子。

@cert-authority _.example.com ssh-rsa AAAAB3Nz...XNRM1EX2gQ== 上面代碼中,_.example.com 是域名的模式匹配,表示只要服務器符合該模式的域名,且簽發服務器證書的 CA 匹配後面給出的公鑰,就均可以信任。若是沒有域名限制,這裏能夠寫成*。若是有多個域名模式,可使用逗號分隔;若是服務器沒有域名,能夠用主機名(好比 host1,host2,host3)或者 IP 地址(好比 11.12.13.14,21.22.23.24)。

而後,就可使用證書,登陸遠程服務器了。

$ ssh -i ~/.ssh/user_key user@host.example.com

上面命令的 -i 參數用來指定用戶的密鑰。若是證書與密鑰在同一個目錄,則鏈接服務器時將自動使用該證書。

11、廢除證書

廢除證書的操做,分紅用戶證書的廢除和服務器證書的廢除兩種。

服務器證書的廢除,用戶須要在 known_hosts 文件裏面,修改或刪除對應的 @cert-authority 命令的那一行。

用戶證書的廢除,須要在服務器新建一個 /etc/ssh/revoked_keys 文件,而後在配置文件 sshd_config 添加一行,內容以下。

RevokedKeys /etc/ssh/revoked_keys

revoked_keys 文件保存再也不信任的用戶公鑰,由下面的命令生成。

$ ssh-keygen -kf /etc/ssh/revoked_keys -z 1 ~/.ssh/user1_key.pub

上面命令中,-z 參數用來指定用戶公鑰保存在 revoked_keys 文件的哪一行,這個例子是保存在第 1 行。

若是之後須要廢除其餘的用戶公鑰,能夠用下面的命令保存在第 2 行。

$ ssh-keygen -ukf /etc/ssh/revoked_keys -z 2 ~/.ssh/user2_key.pub

12、參考連接

  • SSH Emergency Access, Carl Tashian
  • Using OpenSSH Certificate Authentication, Red Hat Enterprise Linux Deployment Guide
  • How to SSH Properly, Gus Luxton

jishuroad.jpg

相關文章
相關標籤/搜索