1. 程式人生 > >Linux的SSH免密登入認證過程研究

Linux的SSH免密登入認證過程研究

一、先看下SSH免密登入使用到的工具和生成的檔案

工具:ssh-keygen用於生成祕鑰檔案,其中祕鑰分為公鑰和私鑰、ssh-copy-id用於複製公鑰檔案到被控制機。

檔案:ssh-keygen生成的祕鑰檔案有兩個,放在~/.ssh/,id_rsa為私鑰、id_rsa.pub為公鑰

被控制機檔案:通過ssh-copy-id複製的公鑰在被控制機這個檔案裡,~/.ssh/authorized_keys

id_rsa.pub公鑰如下示例:

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAvSkEZ0fKXRqQ/DkjCfsAETsQgV8OR/RVQmwBk/J5IWoknf8Dr
y5kOs
+1bnx9zaf8oIcVuXf0jRxTccLBOXiReFJE4aD2rWO33sqA0M4qP1ESYhsU4yokRA0IMDJ62JUv2cWVJg GpeQriol2t7mH8E6aB8OiJ+NgRbh6+/0LbtQs40VA2+W5PtaBwT4sjv9LOHIdzQcsEeCM8MIHqmXHst7/JuVI i7wLCxB7Ur8qtwZ2/Ii8Ckjfo6mikWmSh6mRMq9qn0FkMkPCcpm8o4f1zJWOuf+RnjPpopFTqIa8JssMHJMuQ cCm3EHDkBHjLk/SkidWOzqOtSvUeGKieWiijuw== [email protected]

id_rsa私鑰如下示例:

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA3zh+wHRki5ysBPcrDxL/MGI/vO4aYW6nTgShJKoNny79wkyY
UhhPukkYtRhAxflmqwSvs1kUmYNRrUN1MEeJHEVdZvkQeyLHf1gCkaw1G5Gi/Ijv
WcdKZ4SoUJj3bBYjuH93oIInQCeKSJ26DkiK/yyZuU4P82SZej78dVceJQZf/GzD
uFQYm4CLFDPHq+/Vf/OtedBSvGST/c+gj3O97G9RV+kIfbZJjrR8SKky/vwKUtsv
5b8bQX6c5ZV8GXiDr3TwExljMW
+OE9P6yXiYv5MrF6qrh6GevoZxKVy1xs/GTn1N VBxevqK8haEjTIqDhuAyXtb7BRa1UuY2Q9G1gwIDAQABAoIBAG67uO1CECrOAuvH rZ2hv+RBqPrRZ1bULLzgQQxOK8m+5vV/R8TZ+Jsh7dbQfDl5unu2LG8dDsIEyfzY zQaxRgw3QNl3Try3CR5cC5I2SnYtrhv21j3ERl3KCjFJYNxGs1uwKCkAx/XkZ44U aJrzU7i4aF3rorAMRLLHEjgninW0obQhfUKOZCMQBRtWWdzFz+/qfX7aiO/3Iz0W bF5A8ygn20C25zBNYQUAzF1L2xnMRvTELsa8v/k+bnVc0E8BnFJ5SwmK7dalL8w4 b3wvtDTXv1betE/4+fWB8tbkGaqslrhbo0SS8IZNXCYS3kRDC7AcCszP5Alqm4hI PTFkHiECgYEA8Tdo4h+Hw7/wR+bJJjexxuD5nHrFtHa+h9UTQFB6MlIChDPGuvfB oHlScErIsrLIzIgjpFnnb4nEtc6/IYzyPDma0VTypLij5yuSTk8rPgnwm9qZBXmo j0spHW8ti5qdsNzFKnpX8x5RPD8+ROr67aee7LVOOf6mWnwcHShMDnECgYEA7Oa9 NOn+DUz7rIAr3wuouV5Zc7CC4ij0SNYdKaoH24SrF2QSXbgQIZiV1z/KZyJefyHS J+PpcfvRz7BD3RT4Ze7d3Tz1aqtjLkM100b15FDUQKYKUvvUDUgKhskFEos0VSvG /WwyAXSqFTqXJqxzUzskTa3sLvaPLtaqTlMcpTMCgYBKHdVrTXbgzdQds6rwxEIq sqvfydV/qtDGWdEtfMzfM1W0m1gf0Mq87SpIeKIMTmTme5pAAKPdIL7BgkI2I+G2 YZjRY0GfHWC3QisVRrwpttIogVVtWkFRri127tdWwu5bDqrCb48gk5swYNpYQL9T UKLDZr4fkcA5o1LcHqqn8QKBgQCZ661hdOr5D1yyDrDygavFjPTHwxa3BO77aAqY qH3kdgWH9CAuvknU2kP5D9xdOCp3paza+C0UPw5qR9dADMD70cBbX6EBBowxYb/W H1PiXVYbDwbENhTn8DfOrUtbahC9ie0HeUXgRkG/+0p7+S4RFOsYgXlkZhRP1W/f 5gZFmwKBgQDPuKUBsGuOpnaV+8q0wtjbKtHbTLSlAGNnnRDIs/5xBms1onekFpIU f3TawKYayf2IN/PLygeoa3PC8Rd6KHCy0Y7A2TD/sxMgNiPaz4L4KoWMcIk+rzuc OMIvyyXX2qUTxVagF6aaE65dQ+GGxr4pUS3YJhPizpA6dPp8Apbd4w== -----END RSA PRIVATE KEY-----

二、驗證過程

不是說在某個使用者下免密之後,就必須要在特定的使用者下進行登入,其實這個不太符合實際;應該說SSH免密登入時會找當前使用者下的~/.ssh/目錄下的檔案進行驗證登入,所以不一定要存在檔案和指定的使用者,只要有內容即可,通常SSH免密登入時指定私鑰。

下面是詳細的登入過程:

在建立連線的時候, 涉及到2對金鑰, 其中一對為準備階段產生並分配好的金鑰對, 另一對為伺服器在接收到一個連線請求時生成的金鑰對. 為了講述方便, 我們將這兩組金鑰對錶示如下

Symbol Description
PubC 客戶端金鑰對應的公鑰
PrvC 客戶端握有的私鑰
PubS 伺服器端產生的公鑰
PrvS 伺服器端產生的私鑰

1、認證

①伺服器生成隨機數(稱之為challenge) x, 並用 PubC 加密後生成結果 s(x), 傳送給客戶端.

②客戶端使用 PrvC 解密 s(x) 得到 x, 再將xPubS加密傳送回伺服器端.

③伺服器端使用PrvS解密得到x, 進行核對, 如果正確則連結正式成立.

2、通訊加密

在請求連線前, 伺服器端和客戶端擁有的金鑰為

1
2
3
Server          |           Client
--------------------------------------
PubC | PrvC

①客戶端發出申請. 伺服器會產生一組 session 金鑰對, 即PubSPrvS.

此時伺服器端和客戶端擁有的金鑰如下所示

1
2
3
4
5
Server           |           Client
-------------------------------------
PubC | PrvC
PubS |
PrvS |

②伺服器端利用客戶端的公鑰PubC對 session 公鑰PubS進行加密後傳送給客戶端.

③客戶端用自己的金鑰PrvC解密資訊,得到 session 公鑰PubS

1
2
3
4
5
Server           |           Client
-------------------------------------
PubC | PubS
PrvS | PrvC
PubS |

④之後的資料互動,都通過對方方公鑰加密,對方收到資訊後,用其私鑰解密,實現安全加密過程。

流程如下所示:

 

三、SSH登入指定私鑰

從上面的原理可以分析出,在通訊時,並不需要控制機使用公鑰做什麼,而被控制機需要使用到公鑰,再就是控制機主要使用到的是私鑰,所以SSH可以指定私鑰進行遠端登入。

命令如下:-i指定了私鑰檔案

ssh -i /root/.ssh/id_rsa [email protected]

 

 

參考(以上內容部分轉自下面文章):

https://fancyseeker.github.io/2013/12/30/ssh_overview/

https://www.jianshu.com/p/0f9b72d691c2 

https://www.jianshu.com/p/2b5ab0e9e8b1

https://segmentfault.com/a/1190000012484646

https://www.waitig.com/ssh%E5%85%8D%E5%AF%86%E7%99%BB%E5%BD%95%E5%AE%9E%E7%8E%B0%E5%8A%9E%E6%B3%95%E5%8F%8A%E5%8E%9F%E7%90%86.html

https://www.cnblogs.com/scofi/p/6617394.html

https://blog.csdn.net/qq_26907251/article/details/78804367