因爲 git 大文件用 http 方式難以傳輸,必須使用 ssh-key,而 ssh-key 又生成了好多個。最近在各類折騰 ssh,公鑰私鑰上花費了不少時間,現將一些問題總結以下。系統爲 Mac/Linux。linux
SSH之因此可以保證安全,緣由在於它採用了公鑰加密。git
整個ssh密碼登陸過程是這樣的:github
在linux上,若是你是第一次登陸對方主機,系統會出現下面的提示:算法
$ ssh user@hostshell
The authenticity of host 'host (12.18.429.21)' can't be established.安全
RSA key fingerprint is 98:2e:d7:e0:de9f:ac:67:28:c2:42:2d:37:16:58:4d.服務器
Are you sure you want to continue connecting (yes/no)?ssh
這段話的意思是,沒法確認host主機的真實性,只知道它的公鑰指紋,問你還想繼續鏈接嗎?gitlab
所謂"公鑰指紋",是指公鑰長度較長(這裏採用RSA算法,長達1024位),很難比對,因此對其進行MD5計算,將它變成一個128位的指紋。上例中是98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d
,再進行比較,就容易多了。網站
很天然的一個問題就是,用戶怎麼知道遠程主機的公鑰指紋應該是多少?回答是沒有好辦法,遠程主機必須在本身的網站上貼出公鑰指紋,以便用戶自行覈對。
假定通過風險衡量之後,用戶決定接受這個遠程主機的公鑰。
Are you sure you want to continue connecting (yes/no)? yes
系統會出現一句提示,表示host主機已經獲得承認。
Warning: Permanently added 'host,12.18.429.21' (RSA) to the list of known hosts.
而後,會要求輸入密碼。
Password: (enter password)
若是密碼正確,就能夠登陸了。
原文:http://itindex.net/detail/48724-ssh-認證-原理
在命令行中,鍵入
ssh-keygen -t rsa -C "$your_email"
會生成一對密鑰,默認的狀況下,私鑰將放在~/.ssh/id_rsa
,對應的公鑰則爲~/.ssh/id_rsa.pub
。
在生成的過程當中,會詢問你放密鑰的位置。因爲每一個人可能不止須要一個密鑰,因此能夠另存爲其餘名字的密鑰,好比path/to/your/dir/id_rsa_new
,此時它也將生成對應的公鑰。
使用如下代碼來查看生成的公鑰
cat ~/.ssh/id_rsa.pub
將公鑰複製到你須要的服務器上(好比 github,gitlab 等等)
如前文所說,若是咱們須要多個密鑰,那麼在使用中,如何肯定實際使用哪個呢?
目前爲止,ssh-key 用得最多的兩個 地方,一是 git 相關服務,二是遠程鏈接服務器。
用-i
指定私鑰,-p
指定端口,鏈接服務器
ssh -i path/to/your/key developer@192.168.1.237 -p 23 scp -i path/to/your/key filename developer@192.168.1.237:/diskpath
因爲 git 命令不能指定私鑰,因此要經過 ~/.ssh/config 文件來控制。若是沒有就在~/.ssh目錄建立config文件,該文件用於配置私鑰對應的服務器。好比:
Host github HostName github.com User git IdentityFile ~/.ssh/id_rsa Host tsinghua HostName tsinghua.edu.cn User git IdentityFile ~/.ssh/id_rsa_new
這樣,連接到 github.com 時,使用的就是 id_rsa;連接到 tsinghua.edu.cn 時,使用 id_rsa_new。另外,Host 的名字能夠隨便設置,而且在 ssh 後面至關於 User@HostName,好比 ssh github
等價於 ssh git@github.com
。
若是工做中,你使用了一個沒有密碼的私鑰,有一天服務器被黑了,你是跳到黃河都洗不清。而生成密鑰時,每每會選擇一個比較簡單的密碼。爲了安全起見,仍是應該修改一下:利用ssh-keygen -p
,系統會提示選擇須要修改的私鑰,默認是~/.ssh/id_rsa
,選好文件後按回車,會提示你輸入舊密碼,輸入好後會提示輸入新密碼,則修改完成。