1. 在開始之前,你需要了解一些情況
用 SSH 公鑰認證從而連接登陸遠程服務器是一個強大的功能,比通過賬號密碼登錄更加安全。SSH 公鑰依賴于非對稱加密算法,該算法生成一對分開的密鑰,即公鑰和私鑰。你保密私鑰,并將它存儲在你用來進行遠程連接系統(tǒng)的電腦上。因此,你可以分享你的公鑰而不泄露私鑰;你存儲公鑰到遠程系統(tǒng)的 ~/.ssh/authorized_keys 文件。
為了使用 SSH 公鑰認證:
- 遠程系統(tǒng)上必須安裝同一版本的 SSH。本文的信息是假設(shè)遠程系統(tǒng)使用的是 OpenSSH 的情況下,如果遠程系統(tǒng)使用的是不同的版本(如 Techia SSH),下面的描述可能不準確。
- 你用于遠程連接服務的電腦上也必須安裝同一版本的 SSH。
- 你需要能把你的公鑰傳輸?shù)竭h程系統(tǒng)上。
2. 在 Linux 或者 Mac 電腦上設(shè)置公鑰驗證
為了在 Linux 或者 Mac 上設(shè)置公鑰驗證:
- 登陸到你將要用于遠程連接的電腦上,然后用 SSH 命令行去通過 RSA 算法生成密鑰對。
ssh-keygen -t rsa
- 你將根據(jù)提示提供文件名(保存密鑰對)和密碼(保存你的私鑰)
-
文件名:如果不輸入任何值,按下回車。則是默認的文件名
另外,你也可以在提示中輸入文件名(如,
my_ssh_key),然后按下回車鍵。然而一些遠程主機都被配置為通過默認的路徑和默認文件名去接受私鑰(對于 RSA 密鑰來說,默認為~/.ssh/id_rsa)。因此,為了使用有不同的文件名的私鑰去通過認證,或者使用沒存儲在默認路徑的私鑰去通過認證,你必須明確的調(diào)用在 SSH 命令行或者在 SSH 客戶端的配置文件(~/.ssh/config)。這里是詳細介紹 -
密碼:輸入至少五個字節(jié)的密碼,然后按下
回車鍵。如果你什么都沒輸入,就按下回車,那你的私鑰將處于無密碼保護狀態(tài)注意:
UITS 強烈建議使用密碼保護你的私鑰。如果你沒有密碼保護你的私鑰,可以想象任何一個擁有連接您電腦權(quán)限的人,在有對應公鑰的情況下,在任意一臺遠程系統(tǒng)上都能登陸到您的賬號。
-
你的私鑰將使用默認文件名(如:id_rsa)或者你指定的文件名(如:my_ssh_key)生成,然后存儲在你電腦主目錄下的 .ssh 文件下。(如:~/.ssh/id_rsa 或 ~/.ssh/my_ssh_key)
相應的公鑰也將用相同的文件名生成(但是有額外的 .pub 擴展名),存儲在相同目錄下(如:~/.ssh/id_rsa.pub 或者 ~/.ssh/my_ssh_key.pub)
- 使用
SFTP或者SCP復制你的公鑰文件(如:~/.ssh/id_rsa.pub)到你的遠程系統(tǒng)的賬號上。如用scp命令行
scp ~/.ssh/id_rsa.pub username@host:
- 用你的賬號和密碼登陸遠程系統(tǒng)
如果遠程電腦上沒有配置支持基于密碼的身份認證,你將需要聯(lián)系系統(tǒng)管理員,添加你的公鑰到你賬戶下的
~/.ssh/authorized_keys文件(如果你的賬戶上沒有~/.ssh/authorized_keys文件,管理員可以為你創(chuàng)建一個文件)。一旦你的公鑰被加入到遠程系統(tǒng)的~/.ssh/authorized_keys文件中,設(shè)置過程就完成了,你可以在有你私鑰的電腦上通過SSH登陸你的遠程賬
- 如果你遠程系統(tǒng)的賬戶中沒有
~/.ssh/authorized_keys文件,創(chuàng)建一個;在命令行中,輸入以下命令:
mkdir -p ~/.ssh
touch ~/.ssh/authorized_keys
注意:
如果遠程系統(tǒng)上你的賬號已經(jīng)有
~/.ssh/authorized_keys文件,執(zhí)行以上命令,不會對已經(jīng)存在的文件造成任何損害
- 在遠程系統(tǒng)中,添加之前上傳的公鑰文件(如:
~/id_rsa.pun)內(nèi)容到~/.ssh/authorized_keys文件的新的行;在命令行,輸入以下內(nèi)容:
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
你可能想驗證 ~/.ssh/authorized_keys 的內(nèi)容去確保正確添加了你的公鑰;在命令行輸入以下內(nèi)容:
more ~/.ssh/authorized_keys
- 在遠程系統(tǒng)的你的賬戶上,可以安全刪除公鑰文件(如:
~/id_rsa.pub)。在命令行輸入以下內(nèi)容:
rm ~/id_rsa.pub
另外,如果你想要在遠程系統(tǒng)上保存公鑰的備份,把它移動到你的 .ssh 目錄中;在命令行執(zhí)行以下命令:
mv ~/id_rsa.pub ~/.ssh/
可選。重復執(zhí)行步驟 3-7 去添加你的公鑰到其他的你想要通過 SSH 鏈接的遠程系統(tǒng)中。
-
現(xiàn)在,你應該可以在擁有你私鑰(如:
~/.ssh/id_rsa.pub)的電腦上通過 SSH 遠程連接到你的賬戶- 如果你的私鑰有了密碼保護,那么遠程系統(tǒng)將會提示你關(guān)于這個密碼(你私鑰的密碼沒有傳遞給遠程系統(tǒng)):
$ ssh username@host Enter passphrase for key '/username/Host1/.ssh/id_rsa': Last login: date from otherHost- 如果你的私鑰沒有密碼保護,遠程系統(tǒng)將會把你置于你的主目錄的命令行,而不會就密碼問題提示你
$ ssh username@host Last login: date from otherHost
如果你現(xiàn)在用的私鑰,并不是默認名稱或者存放在默認的目錄(如:~/.ssh/id_rsa),你必須用明確的使用下面的兩個方法中的一個
1. 在 SSH 命令行:添加 `-i` 標志和你的私鑰路徑
比如:為了調(diào)用你的私鑰 `host2_key`,存放在 `~/.ssh/old_keys` 目錄,當連接你在遠程主機上的賬戶時,輸入:
ssh -i ~/.ssh/old_keys/host2_key username@host
2. 在 SSH 客戶端的配置文件中:SSH 會從以下來源中獲取配置數(shù)據(jù):
1) 來自命令行選項
2) 來自用戶客戶端的配置文件(~/.ssh/config),如果存在的話
3) 從系統(tǒng)范圍的客戶端配置文件(/etc/ssh/ssh_config)
SSH 客戶端配置文件是一個包含了關(guān)鍵字和參數(shù)的 txt 文件。為了指定哪個私鑰應該被用來與特定的遠程主機進行連接,用文本編輯器創(chuàng)建 ~/.ssh/config 包含了 Host 和 IdentityFile 關(guān)鍵字。
比如,要鏈接 host2.somewhere.edu,為了使 SSH 自動調(diào)用存儲在 ~/.ssh/old_keys 目錄的私鑰 host2_key,創(chuàng)建一個包含了以下行的 ~/.ssh/config 文件
Host host2.somewhere.edu
IdentityFile ~/.ssh/old_keys/host2_key
保存文件后,SSH 將用指定的私鑰去與這個主機進行連接。
你可以添加多個 Host 和 IdentityFile 去指定不同的私鑰對應不同的主機列表,如:
Host host2.somewhere.edu
IdentityFile ~/.ssh/old_keys/host2_key
Host host4.somewhere.edu
IdentityFile ~/.ssh/old_keys/host4_key
Host host6.somewhere.edu
IdentityFile ~/.ssh/old_keys/host6_key
另外,你也可以用單個的 * 號為所有的主機提供一個全局的默認值。(即,一個私鑰對應多個主機)
Host *.somewhere.edu
IdentityFile ~/.ssh/old_keys/all_hosts_key
以上內(nèi)容,均來源于https://kb.iu.edu/d/aews