SSH 免密登錄是怎么玩兒的?

歡迎Follow我的GitHub, 關(guān)注我的CSDN. 其余參考Android目錄.微信公眾號(hào):程序員小樂(lè)

每日英文

Don't be afraid of the space between your dreams and reality. If you can dream it, you can make it so.

別害怕夢(mèng)想和現(xiàn)實(shí)的距離。只有想不到,沒(méi)有做不到。

小樂(lè)有話說(shuō)

愿你所有的努力都不白費(fèi),所想的都能如愿,所做的都能實(shí)現(xiàn),愿你往后路途, 深情不再枉付。

來(lái)自 / biezhi

鏈接 / blog.biezhi.me/2017/08/ssh-no-password-login.html

image

責(zé)編:樂(lè)樂(lè) | 封面來(lái)自網(wǎng)絡(luò)

00 序言

作為一名后端開(kāi)發(fā),經(jīng)常會(huì)遇到SSH登錄,Git 提交等事務(wù),而當(dāng)你有很多服務(wù)器的時(shí)候使用密碼可能不是一個(gè)好的選擇了, 就像我要登錄自己的服務(wù)器、公司各個(gè)環(huán)境的服務(wù)器,雖然有工具可以幫我們做這些,但我習(xí)慣在命令行下操作。 下面我?guī)懔私庖幌旅饷艿卿浀脑砗腿绾螌?shí)現(xiàn)。

01 基本概念

SSH協(xié)議

SSH 是一種計(jì)算機(jī)之間加密登錄的協(xié)議,它相對(duì)于 telnetrsh 的明文傳輸, 提供了加密、校驗(yàn)和壓縮,使得我們可以很安全的遠(yuǎn)程操作, 而不用擔(dān)心信息泄露(當(dāng)然不是絕對(duì)的,加密總有可能被破解,只是比起明文來(lái)說(shuō)那是強(qiáng)了不少)。

加密

加密的意思是將一段數(shù)據(jù)經(jīng)過(guò)處理之后,輸出為一段外人無(wú)法或者很難破譯的數(shù)據(jù),除了指定的人可以解密之外。 一般來(lái)說(shuō),加密的輸入還會(huì)有一個(gè)key,這個(gè)key作為加密的參數(shù),而在解密的時(shí)候也會(huì)用一個(gè)相關(guān)聯(lián)(有可能是相同)的key作為輸入。 粗略來(lái)說(shuō)是下面的流程:

# 加密方encrypted_data = encrypt(raw_data, key)# 解密方raw_data = decrypt(encrypted_data, key1)

目前主流的加密算法一般分為下面兩類(lèi):

  1. 私鑰(secret key)加密,也稱為對(duì)稱加密

  2. 公鑰(public key)加密

私鑰加密

所謂的私鑰加密,是說(shuō)加密方和解密方用的都是同一個(gè)key,這個(gè)key對(duì)于加密方和解密方來(lái)說(shuō)是保密的, 第三方是不能知道的。在第三方不知道私鑰的情況下,是很難將加密的數(shù)據(jù)解密的。 一般來(lái)說(shuō)是加密方先產(chǎn)生私鑰,然后通過(guò)一個(gè)安全的途徑來(lái)告知解密方這個(gè)私鑰。

公鑰加密

公鑰加密,是說(shuō)解密的一方首先生成一對(duì)密鑰,一個(gè)私鑰一個(gè)公鑰,私鑰不會(huì)泄漏出去,而公鑰則是可以任意的對(duì)外發(fā)布的。 用公鑰進(jìn)行加密的數(shù)據(jù),只能用私鑰才能解密。加密方首先從解密方獲取公鑰,然后利用這個(gè)公鑰進(jìn)行加密,把數(shù)據(jù)發(fā)送給解密方。 解密方利用私鑰進(jìn)行解密。如果解密的數(shù)據(jù)在傳輸?shù)倪^(guò)程中被第三方截獲,也不用擔(dān)心,因?yàn)榈谌經(jīng)]有私鑰,沒(méi)有辦法進(jìn)行解密。

公鑰加密的問(wèn)題還包括獲取了公鑰之后,加密方如何保證公鑰來(lái)自于確定的一方,而不是某個(gè)冒充的機(jī)器。 假設(shè)公鑰不是來(lái)自我們信任的機(jī)器,那么就算我們用公鑰加密也沒(méi)有用,因?yàn)榧用苤蟮臄?shù)據(jù)是發(fā)送給了冒充的機(jī)器, 該機(jī)器就可以利用它產(chǎn)生的私鑰進(jìn)行解密了。所以公鑰加密里面比較重要的一步是身份認(rèn)證。

需要說(shuō)明一下,一般的私鑰加密都會(huì)比公鑰加密快,所以大數(shù)據(jù)量的加密一般都會(huì)使用私鑰加密, 而公鑰加密會(huì)作為身份驗(yàn)證和交換私鑰的一個(gè)手段。

數(shù)據(jù)一致性/完整性

數(shù)據(jù)一致性說(shuō)得是如何保證一段數(shù)據(jù)在傳輸?shù)倪^(guò)程中沒(méi)有遺漏、破壞或者修改過(guò)。一般來(lái)說(shuō),目前流行的做法是對(duì)數(shù)據(jù)進(jìn)行hash, 得到的hash值和數(shù)據(jù)一起傳輸,然后在收到數(shù)據(jù)的時(shí)候也對(duì)數(shù)據(jù)進(jìn)行hash,將得到的hash值和傳輸過(guò)來(lái)的hash值進(jìn)行比對(duì), 如果是不一樣的,說(shuō)明數(shù)據(jù)已經(jīng)被修改過(guò);如果是一樣的,則說(shuō)明極有可能是完整的。

目前流行的hash算法有 MD5 和 SHA-1 算法。

身份驗(yàn)證

身份驗(yàn)證說(shuō)的是,判斷一個(gè)人或者機(jī)器是不是就是你想要聯(lián)系的。也就是說(shuō)如果A想要和B通信,一般來(lái)說(shuō)開(kāi)始的時(shí)候會(huì)交換一些數(shù)據(jù), A怎么可以判斷發(fā)送回來(lái)的數(shù)據(jù)就真的是B發(fā)送的呢?現(xiàn)實(shí)中有很多方法可以假冒一個(gè)機(jī)器。

在SSH里面,這主要是通過(guò)公鑰來(lái)完成的。首先客戶端會(huì)有一個(gè)公鑰列表,保存的是它信任的機(jī)器上面的公鑰。 在開(kāi)始SSH連接之后,服務(wù)器會(huì)發(fā)送過(guò)來(lái)一個(gè)公鑰,然后客戶端就會(huì)進(jìn)行查找,如果這個(gè)公鑰在這個(gè)列表里面,就說(shuō)明這個(gè)機(jī)器是真的服務(wù)器。

當(dāng)然實(shí)際的情況會(huì)復(fù)雜一些。實(shí)際上服務(wù)器不是真的發(fā)送公鑰過(guò)來(lái),因?yàn)檫@很容易被第三方盜取。

02 免密碼登錄

1、在自己的操作系統(tǒng)上生成一對(duì)SSH KEY,如果已經(jīng)存在可以不生成。

2、將公鑰上傳到服務(wù)器上。

生成SSH密鑰和公鑰

ssh-keygen -t rsa

這樣會(huì)在當(dāng)前目錄生成名為id_rsa的私鑰文件和名為id_rsa.pub的公鑰文件,-t表示密鑰類(lèi)型是rsa。 如果你只輸入ssh-keygen生成的RSA密鑰長(zhǎng)度為2048,如果你對(duì)安全性要求比較高可以指定4096位的長(zhǎng)度:

ssh-keygen -b 4096 -t rsa

這里-b就是多少位,當(dāng)然你對(duì)這些參數(shù)感興趣可以使用--help參數(shù)看看具體的含義和解釋。

當(dāng)你在生成SSHKEY的時(shí)候在命令行下會(huì)提示你Enter file in which to save the key,讓你確認(rèn)密鑰文件保存的路徑, 一般回車(chē)即可(一般默認(rèn)會(huì)在當(dāng)前用戶家目錄下的.ssh目錄下)。

第二個(gè)提示是 Enter passphrase (empty for no passphrase) 讓你輸入一個(gè)密鑰的密碼,如果不輸入則留空;回車(chē)生成公私鑰完畢 :) 此時(shí)你可以使用cat命令看下自己的公私鑰。

服務(wù)器配置

我們前面在自己的操作系統(tǒng)生成了公私鑰,然后將公鑰的內(nèi)容告訴給服務(wù)器就可以了,讓服務(wù)器知道自己公鑰的操作方式還蠻多的。

上傳公鑰文件

將本地的公鑰文件上傳到服務(wù)器上,然后在服務(wù)器需要免密登錄的用戶家目錄下查看是否有 ~/.ssh/authorized_keys 這個(gè)文件, 如果沒(méi)有手動(dòng)創(chuàng)建一個(gè):

touch ~/.ssh/authorized_keys

然后我們將公鑰內(nèi)容寫(xiě)入到authorized_keys文件中,因?yàn)檫@個(gè)文件可能已經(jīng)有內(nèi)容了,所以你可以使用如下方式

cat -n ~/.ssh/rsa.pub ~/.ssh/authorized_keys

這樣就將公鑰內(nèi)容追加到authorized_keys中了,然后需要注意配置權(quán)限了,否則SSH不會(huì)工作的,我在這里踩了坑。。

  1. 將.ssh目錄的權(quán)限為700
  1. 將authorized_keys目錄的權(quán)限為600

ssh-copy-id 復(fù)制公鑰

這個(gè)工具還蠻有用的,不過(guò)它會(huì)將我本地的所有公鑰都傳到服務(wù)器,使用方法:

ssh-copy-id username@remote-server

因?yàn)槲业姆?wù)器SSH端口不是22,所以使用 ssh-copy-id 登錄用戶@服務(wù)器IP -p端口

**03 試試運(yùn)用 **

我們完成了這些步驟是不是就可以免密登錄了呢?是的,你現(xiàn)在登錄服務(wù)器:

ssh user@host -p22

注意修改你自己的登錄信息。

再簡(jiǎn)單一點(diǎn)

我們前面生成SSHKEY的時(shí)候還有一個(gè)私鑰沒(méi)用到,這是干什么用的呢? 公鑰是公開(kāi)的,任何人都可以獲得,私鑰則是保密的,只有本地存儲(chǔ)了一份,

配置本地的ssh,修改 ~/.ssh/config 文件:

Host yourserver  HostName 192.168.11.22  Port 12345  User username  IdentityFile ~/.ssh/id_rsa

這里的 Host 是我們要登錄的服務(wù)器的別名,為了方便快捷登錄,下面是服務(wù)器的信息,最后一項(xiàng)是你的私鑰路徑。

完成這個(gè)配置后我們就可以使用 ssh yourserver,進(jìn)行登錄啦~

Github添加公鑰

我經(jīng)常會(huì)用到Github提交,拉取代碼,總不能每次都輸入用戶名和密碼吧。。 于是在Github上添加我自己的公鑰即可

image

配置完成后從你自己倉(cāng)庫(kù)的提交、拉取等操作就不用再輸密碼了。

04 常見(jiàn)問(wèn)題

ssh key Key is invalid

密鑰錯(cuò)誤,或者配置錯(cuò)誤

github ssh key Key is invalid. Ensure you’ve copied the file correctly

在github上添加新key時(shí),沒(méi)有正確拷貝 ~/.ssh/id_rsa.pub 內(nèi)容所致。 一般發(fā)生在linux下,因?yàn)閣indows下用 notepa++ 打開(kāi)這個(gè)文件并復(fù)制一般是沒(méi)有問(wèn)題的, 而linux下使用vim打開(kāi)再?gòu)?fù)制就會(huì)因?yàn)関im添加了回車(chē)而導(dǎo)致key添加失敗。

解決辦法是:使用cat命令將 ~/.ssh/id_rsa.pub 內(nèi)容輸出到終端,再拷貝。

參考資料:

猜你有話說(shuō)

歡迎你在留言區(qū)和我分享你的想法,讓我們一同探討提高。小樂(lè)期待你的分享!

image

猜你還想看

阿里、騰訊、百度、華為、京東最新面試題匯集

設(shè)計(jì)和實(shí)現(xiàn)一款輕量級(jí)的爬蟲(chóng)框架

紅黑樹(shù)插入算法實(shí)現(xiàn)原理分析

如何通俗理解設(shè)計(jì)模式及其思想!

搜索引擎:該如何設(shè)計(jì)你的倒排索引?

這里有技術(shù)心得、算法、職場(chǎng)、感悟面經(jīng),做一個(gè)有趣的幫助程序員成長(zhǎng)的公眾號(hào)。看完本文有收獲?請(qǐng)轉(zhuǎn)發(fā)分享給更多人。
PS:如何您想進(jìn)技術(shù)群交流,關(guān)注公眾號(hào)在后臺(tái)回復(fù) “加群”,或者 “學(xué)習(xí)” 即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容