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
, 再將x
用PubS
加密發送回服務器端.③服務器端使用
PrvS
解密得到x
, 進行核對, 如果正確則鏈接正式成立.2、通信加密
在請求連接前, 服務器端和客戶端擁有的密鑰為
1
2
3Server | Client
--------------------------------------
PubC | PrvC①客戶端發出申請. 服務器會產生一組
session
密鑰對, 即PubS
和PrvS
.此時服務器端和客戶端擁有的密鑰如下所示
1
2
3
4
5Server | Client
-------------------------------------
PubC | PrvC
PubS |
PrvS |②服務器端利用客戶端的公鑰
PubC
對session
公鑰PubS進行加密後發送給客戶端.③客戶端用自己的密鑰
PrvC
解密信息,得到session
公鑰PubS
。
1
2
3
4
5Server | 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
Linux的SSH免密登錄認證過程研究