事情起因還是昨天 公司的 Git伺服器
進行了升級 導致之前的 SSH Key
都不能使用了需要重新上傳 然後配置專案地址 開通專案許可權即可 很簡單的一個事情。
生成公鑰私鑰
一般檔案都在使用者下的 .ssh
資料夾中
$ ls -l
total 9
-rw-r--r-- 1 reggie 197121 1675 7月 17 16:36 id_rsa
-rw-r--r-- 1 reggie 197121 400 7月 17 16:36 id_rsa.pub
-rw-r--r-- 1 reggie 197121 211 12月 26 17:36 known_hosts
這個是我已有的
新生成的話可以執行下面的命令
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
Generating public/private rsa key pair
Enter file in which to save the key (/使用者/.ssh/id_rsa):
Created directory '/使用者/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /使用者/.ssh/id_rsa.
Your public key has been saved in /使用者/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:gbaLAiKKUm8lv2INJYu4KxXLRF1GT8nTt24geNGI6Co your_email@example.com
The key's randomart image is:
+---[RSA 4096]----+
| . ++o.= |
| . o..+* o . |
| . . o.oo . . |
| o o.o.o.. . |
|++.=.+o.S. o |
|Eo*.o= . o |
|++. +oo . |
|+ oo .. |
|o. . .. |
+----[SHA256]-----+
一路回車就好了 為了更安全還可以設定密碼 不過一般都是預設設定沒有就好了。
其中 id_rsa
是你的私鑰檔案 id_rsa.pub
是你的公鑰檔案 把公鑰檔案上傳到伺服器上就可以 比如 Github 的 SSH Key 管理中
下面在記錄幾個常用的命令
修改金鑰密碼 ssh-keygen -p
切換Git倉庫地址 git remote set-url origin git-repository-address
目錄許可權問題
一般伺服器端的SSH金鑰都在 /etc/ssh
下
[root@localhost ssh]# ls -l /etc/ssh/
$ ls -1 /etc/ssh/ssh_host*
/etc/ssh/ssh_host_dsa_key
/etc/ssh/ssh_host_dsa_key.pub
/etc/ssh/ssh_host_ecdsa_key
/etc/ssh/ssh_host_ecdsa_key.pub
/etc/ssh/ssh_host_ed25519_key
/etc/ssh/ssh_host_ed25519_key.pub
/etc/ssh/ssh_host_rsa_key
/etc/ssh/ssh_host_rsa_key.pub
根據一開始的提示 需要使用 ECDSA
所以選擇使用 ssh_host_ecdsa_key.pub
檔案
另外講下目錄許可權問題
一般 .ssh
目錄許可權為 755 或者 700rsa.id.pub
和 authiruzed_keys
許可權為 644rsa.id
許可權必須是 600
SSH 是什麼
SSH 是一種協議標準,其目的是實現安全遠端登入以及其它安全網路服務。 其實現種類有很多 最出名的就是開源的 OpenSSH
SSH 實現原理
SSH是為了保證更安全的登入等 當然就是對資料進行加密
對稱加密
關於這個更多請自己去科普
簡單點講就是 加密 和 解密 都是使用的 同一組金鑰
1.客戶端請求登入 傳送密碼 假設原始密碼為 123abc
然後使用 金鑰β
進行加密 得到加密內容 xxxxxx....
2.然後把加密內容 xxxxxx....
傳送給伺服器
3.伺服器接受到內容 然後使用 金鑰β
進行解密 得到密碼 然後登入
4.返回登入結果
使用這種對稱加密的方式加密的強度是很高,但是如何儲存金鑰不洩露呢,比如你有很多的客戶端需要使用 他們都需要有一份金鑰,如果其中一個洩露了 這個系統就不在試安全了 因為你都是使用的同一個嘛
非對稱加密
為了解決上面的問題 就有了 非對稱加密
簡單來講就是會生成生成 2個金鑰 一個是 公鑰 一個是 私鑰 一般私鑰放在服務端 自己保證安全不洩露
他們有個特性就是:使用公鑰加密的內容 只能使用私鑰來解密。如果你想透過公鑰來推出私鑰 其機率低的髮指(數學家說的…我不知道有多低 大家都說低那就低嘍)大概 約等於 不可能吧!!!
1.客戶端發起登入請求 然後伺服器返回公鑰給客戶端
2.客戶端拿到公鑰後 對密碼 123abc
進行加密 得到內容 xxxxx...
3.然後把加密內容傳送給伺服器
4.伺服器收到加密內容後使用私鑰進行解密
5.然後驗證使用者身份 執行登入操作
6.返回登入結果
中間人攻擊
理論上上面這樣是安全的,但是這裡會有個問題,就是 你不能保證在上面的流程第一步當中獲取到的公鑰就是你想要連線的伺服器的公鑰
中間人攻擊:
如果有攻擊者在第一步獲取伺服器公鑰的時候就攔截掉 然後把自己的公鑰傳送給了 客戶端。然後使用者用攻擊者的公鑰進行加密併傳送到了攻擊者的伺服器,然後> 攻擊者就可以拿自己的私鑰解密獲取你的資訊,然後他在去請求真正的伺服器從而完成了登入 這就是中間人攻擊
更多詳細內容自己搜尋
SSH 公鑰認證
SSH 怎麼避免中間人攻擊呢。 好像並沒有什麼好辦法,只是在第一次連線的時候他會給出提示 並給出伺服器的公鑰指紋 需要我們自己去做對比 伺服器是否真實!!! 這個可以在 known_hosts
講解中看到。
公鑰認證的登入流程如下
首先使用 ssh-keygen 程式生成公鑰
id_dsa.pub
和私鑰id_dsa
,一般是在客戶端上生成,然後把id_dsa.pub
透過某種方式傳送給服務端。 服務端放在將要遠端登入過來的那個 賬號的目錄的.ssh
目錄下面。
1.客戶端需要生成自己的公鑰和私鑰檔案,並把公鑰檔案上傳到伺服器端
2.客戶端發起登入請求 傳送一個 Keyid
給伺服器 這個keyid 會唯一對應一個客戶端的公鑰 然後伺服器就可以拿這個標識去找客戶端的公鑰
3.伺服器生成一個隨機串 然後用客戶端的公鑰進行加密 最後將加密後的內容傳送給客戶端
4.客戶端收到密文後用自己的私鑰進行解密得到伺服器傳送的隨機串, 然後對隨機串做MD5雜湊 生成摘要
5.客戶端在把最終的摘要傳送給服務端,同時服務端也會用同樣的方法對進行生成摘要
6.最後服務端比較2個摘要內容是否一致 完成認證過程
本作品採用《CC 協議》,轉載必須註明作者和本文連結