歡迎Follow我的GitHub, 關(guān)注我的CSDN. 其余參考Android目錄.微信公眾號(hào):程序員小樂
每日英文
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í)的距離金拒。只有想不到,沒有做不到。
小樂有話說
愿你所有的努力都不白費(fèi),所想的都能如愿铃拇,所做的都能實(shí)現(xiàn),愿你往后路途沈撞, 深情不再枉付慷荔。
來自 / biezhi
鏈接 / blog.biezhi.me/2017/08/ssh-no-password-login.html
責(zé)編:樂樂 | 封面來自網(wǎng)絡(luò)
00 序言
作為一名后端開發(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ì)于 telnet
和 rsh
的明文傳輸, 提供了加密崩掘、校驗(yàn)和壓縮七嫌,使得我們可以很安全的遠(yuǎn)程操作, 而不用擔(dān)心信息泄露(當(dāng)然不是絕對(duì)的呢堰,加密總有可能被破解抄瑟,只是比起明文來說那是強(qiáng)了不少)。
加密
加密的意思是將一段數(shù)據(jù)經(jīng)過處理之后枉疼,輸出為一段外人無法或者很難破譯的數(shù)據(jù)皮假,除了指定的人可以解密之外。 一般來說骂维,加密的輸入還會(huì)有一個(gè)key惹资,這個(gè)key作為加密的參數(shù),而在解密的時(shí)候也會(huì)用一個(gè)相關(guān)聯(lián)(有可能是相同)的key作為輸入航闺。 粗略來說是下面的流程:
# 加密方encrypted_data = encrypt(raw_data, key)# 解密方raw_data = decrypt(encrypted_data, key1)
目前主流的加密算法一般分為下面兩類:
私鑰(secret key)加密褪测,也稱為對(duì)稱加密
公鑰(public key)加密
私鑰加密
所謂的私鑰加密,是說加密方和解密方用的都是同一個(gè)key
潦刃,這個(gè)key對(duì)于加密方和解密方來說是保密的侮措, 第三方是不能知道的。在第三方不知道私鑰的情況下乖杠,是很難將加密的數(shù)據(jù)解密的分扎。 一般來說是加密方先產(chǎn)生私鑰,然后通過一個(gè)安全的途徑來告知解密方這個(gè)私鑰胧洒。
公鑰加密
公鑰加密畏吓,是說解密的一方首先生成一對(duì)密鑰,一個(gè)私鑰一個(gè)公鑰卫漫,私鑰不會(huì)泄漏出去菲饼,而公鑰則是可以任意的對(duì)外發(fā)布的。 用公鑰進(jìn)行加密的數(shù)據(jù)列赎,只能用私鑰才能解密宏悦。加密方首先從解密方獲取公鑰,然后利用這個(gè)公鑰進(jìn)行加密粥谬,把數(shù)據(jù)發(fā)送給解密方肛根。 解密方利用私鑰進(jìn)行解密。如果解密的數(shù)據(jù)在傳輸?shù)倪^程中被第三方截獲漏策,也不用擔(dān)心,因?yàn)榈谌經(jīng)]有私鑰臼氨,沒有辦法進(jìn)行解密掺喻。
公鑰加密的問題還包括獲取了公鑰之后,加密方如何保證公鑰來自于確定的一方,而不是某個(gè)冒充的機(jī)器感耙。 假設(shè)公鑰不是來自我們信任的機(jī)器褂乍,那么就算我們用公鑰加密也沒有用,因?yàn)榧用苤蟮臄?shù)據(jù)是發(fā)送給了冒充的機(jī)器即硼, 該機(jī)器就可以利用它產(chǎn)生的私鑰進(jìn)行解密了逃片。所以公鑰加密里面比較重要的一步是身份認(rèn)證。
需要說明一下只酥,一般的私鑰加密都會(huì)比公鑰加密快褥实,所以大數(shù)據(jù)量的加密一般都會(huì)使用私鑰加密, 而公鑰加密會(huì)作為身份驗(yàn)證和交換私鑰的一個(gè)手段裂允。
數(shù)據(jù)一致性/完整性
數(shù)據(jù)一致性說得是如何保證一段數(shù)據(jù)在傳輸?shù)倪^程中沒有遺漏损离、破壞或者修改過。一般來說绝编,目前流行的做法是對(duì)數(shù)據(jù)進(jìn)行hash僻澎, 得到的hash值和數(shù)據(jù)一起傳輸,然后在收到數(shù)據(jù)的時(shí)候也對(duì)數(shù)據(jù)進(jìn)行hash十饥,將得到的hash值和傳輸過來的hash值進(jìn)行比對(duì)窟勃, 如果是不一樣的,說明數(shù)據(jù)已經(jīng)被修改過逗堵;如果是一樣的秉氧,則說明極有可能是完整的。
目前流行的hash算法有 MD5 和 SHA-1 算法砸捏。
身份驗(yàn)證
身份驗(yàn)證說的是谬运,判斷一個(gè)人或者機(jī)器是不是就是你想要聯(lián)系的。也就是說如果A想要和B通信垦藏,一般來說開始的時(shí)候會(huì)交換一些數(shù)據(jù)梆暖, A怎么可以判斷發(fā)送回來的數(shù)據(jù)就真的是B發(fā)送的呢?現(xiàn)實(shí)中有很多方法可以假冒一個(gè)機(jī)器掂骏。
在SSH里面轰驳,這主要是通過公鑰來完成的。首先客戶端會(huì)有一個(gè)公鑰列表弟灼,保存的是它信任的機(jī)器上面的公鑰级解。 在開始SSH連接之后,服務(wù)器會(huì)發(fā)送過來一個(gè)公鑰田绑,然后客戶端就會(huì)進(jìn)行查找勤哗,如果這個(gè)公鑰在這個(gè)列表里面,就說明這個(gè)機(jī)器是真的服務(wù)器掩驱。
當(dāng)然實(shí)際的情況會(huì)復(fù)雜一些芒划。實(shí)際上服務(wù)器不是真的發(fā)送公鑰過來冬竟,因?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
表示密鑰類型是rsa
疮鲫。 如果你只輸入ssh-keygen
生成的RSA密鑰長度為2048
吆你,如果你對(duì)安全性要求比較高可以指定4096
位的長度:
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)密鑰文件保存的路徑, 一般回車即可(一般默認(rèn)會(huì)在當(dāng)前用戶家目錄下的.ssh目錄下)瘫析。
第二個(gè)提示是 Enter passphrase (empty for no passphrase)
讓你輸入一個(gè)密鑰的密碼砌梆,如果不輸入則留空;回車生成公私鑰完畢 :) 此時(shí)你可以使用cat
命令看下自己的公私鑰贬循。
服務(wù)器配置
我們前面在自己的操作系統(tǒng)生成了公私鑰咸包,然后將公鑰的內(nèi)容告訴給服務(wù)器就可以了,讓服務(wù)器知道自己公鑰的操作方式還蠻多的杖虾。
上傳公鑰文件
將本地的公鑰文件上傳到服務(wù)器上烂瘫,然后在服務(wù)器需要免密登錄的用戶家目錄下查看是否有 ~/.ssh/authorized_keys
這個(gè)文件, 如果沒有手動(dòng)創(chuàng)建一個(gè):
touch ~/.ssh/authorized_keys
然后我們將公鑰內(nèi)容寫入到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ì)工作的葛账,我在這里踩了坑。皮仁。
- 將.ssh目錄的權(quán)限為
700
- 將authorized_keys目錄的權(quán)限為
600
ssh-copy-id 復(fù)制公鑰
這個(gè)工具還蠻有用的籍琳,不過它會(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
注意修改你自己的登錄信息势誊。
再簡單一點(diǎn)
我們前面生成SSHKEY的時(shí)候還有一個(gè)私鑰沒用到呜达,這是干什么用的呢? 公鑰是公開的粟耻,任何人都可以獲得闻丑,私鑰則是保密的漩怎,只有本地存儲(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上添加我自己的公鑰即可
配置完成后從你自己倉庫的提交、拉取等操作就不用再輸密碼了窑滞。
04 常見問題
ssh key Key is invalid
密鑰錯(cuò)誤琼牧,或者配置錯(cuò)誤
github ssh key Key is invalid. Ensure you’ve copied the file correctly
在github上添加新key時(shí),沒有正確拷貝
~/.ssh/id_rsa.pub
內(nèi)容所致哀卫。 一般發(fā)生在linux下巨坊,因?yàn)閣indows下用notepa++
打開這個(gè)文件并復(fù)制一般是沒有問題的, 而linux下使用vim打開再復(fù)制就會(huì)因?yàn)関im添加了回車而導(dǎo)致key添加失敗此改。
解決辦法是:使用cat命令將 ~/.ssh/id_rsa.pub
內(nèi)容輸出到終端趾撵,再拷貝。
參考資料:
RSA算法原理
http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html
SSH原理與運(yùn)用:遠(yuǎn)程登錄
http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html
一個(gè)SSH 公鑰登錄失敗的問題及解決經(jīng)驗(yàn)
https://www.androiddev.net/ssh-public-key-authentication-error/
猜你有話說
歡迎你在留言區(qū)和我分享你的想法共啃,讓我們一同探討提高占调。小樂期待你的分享!
猜你還想看
設(shè)計(jì)和實(shí)現(xiàn)一款輕量級(jí)的爬蟲框架
這里有技術(shù)赶站、心得幔虏、算法、職場(chǎng)贝椿、感悟想括、面經(jīng),做一個(gè)有趣的幫助程序員成長的公眾號(hào)烙博。看完本文有收獲瑟蜈?請(qǐng)轉(zhuǎn)發(fā)分享給更多人烟逊。
PS:如何您想進(jìn)技術(shù)群交流,關(guān)注公眾號(hào)在后臺(tái)回復(fù) “加群”铺根,或者 “學(xué)習(xí)” 即可宪躯。