SSH公鑰登錄和RSA非對稱加密

SSH登錄方式

接觸過Linux服務器的同學肯定用過SSH協議登錄系統,通常SSH協議都有兩種登錄方式:密碼口令登錄和公鑰登陸。

一、密碼口令(類似於賬號密碼登錄)

      1.客戶端連接服務器,服務器把公鑰發給客戶端
      2.客戶端輸入登錄口令,並用服務器公鑰加密後提交給服務器
      3.服務器用私鑰解密,結果匹配,則允許登錄

二、公鑰登錄(一般用RSA非對稱加密)

     1.客戶端生成密鑰對
     2.將客戶端的公鑰寫入服務器的密鑰驗證文件
     3.客戶端請求登錄,服務器生成一段隨機字符串,並使用客戶端公鑰加密後發送給客戶端
     5.客戶端使用自己的私鑰解密,並返回解密後的信息到服務器
     6.服務器進行信息對比,如果結果匹配,則允許登錄

SSH公鑰登陸

生成秘鑰

生成秘鑰,Windows/Linux通用:

# -t:指定秘鑰類型,不指定默認為RSA
# -C:注釋,可以不用設置,主要用於識別秘鑰,可以寫郵箱、用戶名等信息
# -b:秘鑰長度,默認2048位,一般不用設置
ssh-keygen -t rsa -C "www.guitu18.com"

以Windows演示(Linux是一樣的),這裡會有三次確認輸入,第一個是設置秘鑰保存的路徑,第二個和第三個是設置秘鑰的密碼。默認秘鑰保存路徑不用修改,如果不設置密碼直接按三次Enter即可。

生成密鑰對

之後你就能在當前用戶目錄下的.ssh目錄看到生成的公鑰和私鑰了

密鑰對文件

同步發表於://www.guitu18.com/post/2020/05/01/71.html

服務器開啟公鑰登陸

接着就是將我們的公鑰寫入服務器的密鑰驗證文件了,在寫入前我們還要在服務器開啟密鑰登陸。

修改sshd配置文件:vim /etc/ssh/sshd_config

修改SSHD配置文件

這裡你需要關注的參數有三個,逐一說明:

# 公鑰登錄開關,默認是關閉的,將他打開,修改為 yes
PubkeyAuthentication yes
# 秘鑰驗證文件,默認值為 .ssh/authorized_keys 通常不用修改
AuthorizedKeysFile      .ssh/authorized_keys
# 密碼登錄開關,默認開啟(在公鑰登錄調試完成前你可以先開啟密碼登錄)
PasswordAuthentication no

如果你有看過其他配置教程,你可能還會看到要你開啟一個RSAAuthentication的參數:

# 這個參數在CentOS 7.4之後棄用了
RSAAuthentication yes

如果你的系統是CentOS 7.4及以後,你在 /etc/ssh/sshd_config 文件中會找不到這個參數,不用理會也不用將它加進來,SSH第二代協議已經將它廢棄了。

修改完成後重啟sshd服務即可:

# 也可以用這個命令:service sshd restart
systemctl restart sshd

將公鑰寫入服務器

現在你需要把你本地生成的公鑰信息寫入秘鑰驗證文件,也就是 .ssh/authorized_keys文件,你可以將你的公鑰上傳到服務的~/.ssh/目錄後改名為 authorized_keys,也可以用文本編輯器將公鑰打開,複製文本內容到服務器的authorized_keys文件里(配置多態客戶端公鑰時,換行後直接往後面追加公鑰內容即可)。

vim ~/.ssh/authorized_keys

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCp29fDtYdrHaj6l+QAs4RXvkFaoct1mYlKrQze4MQDN1d308SbVLPgY6F3D80MMpdfu9fpKZzNbpgzCWkncfzX8ClJts2AaT1smsr23ubFnq6/OOPXQJi2zIagOorSn+KjME8gHOfraGn1vNKJemdmpqDe+jmWTzlAaGecUHoh+fWwBl5lA/Cz62OJ1k/O3TwLF7sn3QPLggv3CdZ8y3Vh1k6XN9GCtUlL/TujK3iYGHE3410AOLdNb56+t6k/NJJZwpH/x77Zf6sWsZo8Ri/tFGhsCKIniu56o+m6R3/Ar40LOz6gmfJbwfQsqwNGh67/LtO00QDm6qfpEdNkz2v1 www.guitu18.com

使用公鑰登陸

現在你使用你的公鑰來登錄服務器了,這裡以Xshll舉例,點擊鏈接服務器之後,會彈出認證窗口(我關閉了密碼登錄所以密碼選項是灰色的)。點擊 [瀏覽] > [用戶秘鑰] ,在彈出的界面點擊 [導入],選擇你之前生成的秘鑰對中的私鑰(是私鑰不要選錯了),如果在生成秘鑰的時候設置了密碼在導入時也需要輸入密碼。

添加用戶秘鑰

導入私鑰

導入成功後返回認證窗口選擇剛導入的秘鑰登錄,如果生成秘鑰的時候設置了密碼,在用秘鑰登錄時也需要輸入密碼,口令正確即可登錄成功了。

細心的朋友應該看到在證書導入的界面有一個生成按鈕,是的,Xhell也可以幫我們生成證書,而且是圖形化界面操作(Linux非圖形模式只能用命令行生成),非常友好,其實大部分SSH連接工具都帶了生成秘鑰的功能,感興趣的可以自己嘗試一下。

RSA加密

說RSA加密要先說兩個概念:對稱加密和非對稱加密

對稱加密

​ 對稱加密是最快速、最簡單的一種加密方式,加密(encryption)與解密(decryption)用的是同樣的密鑰(secret key)。對稱加密有很多種算法,由於它效率很高,所以被廣泛使用在很多加密協議的核心當中。對稱加密通常使用的是相對較小的密鑰,一般小於256 bit。因為密鑰越大,加密越強,但加密與解密的過程越慢。如果你只用1 bit來做這個密鑰,那黑客們可以先試着用0來解密,不行的話就再用1解;但如果你的密鑰有1 MB大,黑客們可能永遠也無法破解,但加密和解密的過程要花費很長的時間。密鑰的大小既要照顧到安全性,也要照顧到效率。對稱加密的一大缺點是密鑰的管理與分配,換句話說,如何把密鑰發送到需要解密你的消息的人的手裡是一個問題。在發送密鑰的過程中,密鑰有很大的風險會被黑客們攔截。現實中通常的做法是將對稱加密的密鑰進行非對稱加密,然後傳送給需要它的人。

非對稱加密

​ 非對稱加密為數據的加密與解密提供了一個非常安全的方法,它使用了一對密鑰,公鑰(public key)和私鑰(private key)。私鑰只能由一方安全保管,不能外泄,而公鑰則可以發給任何請求它的人。非對稱加密使用這對密鑰中的一個進行加密,而解密則需要另一個密鑰。比如,你向銀行請求公鑰,銀行將公鑰發給你,你使用公鑰對消息加密,那麼只有私鑰的持有人–銀行才能對你的消息解密。與對稱加密不同的是,銀行不需要將私鑰通過網絡發送出去,因此安全性大大提高。目前最常用的非對稱加密算法是RSA算法。雖然非對稱加密很安全,但是和對稱加密比起來,它非常的慢,所以我們還是要用對稱加密來傳送消息,但對稱加密所使用的密鑰我們可以通過非對稱加密的方式發送出去。

引用://www.cnblogs.com/scofi/p/6617394.html

非對稱加密在很多地方都有應用,如HTTPS。HTTPS的非對稱加密還涉及到一個CA證書頒發機構,先通過CA根證書以非對稱加密的方式進行認證,然後再從服務器拿到公鑰,之後再用公鑰加密傳輸對稱加密要用到的秘鑰,這樣就保證了對稱加密證書的安全性,接着就可以愉快的用對稱加密來進行通信了。

非對稱加密在這裡有兩個作用:認證和安全傳輸對稱加密秘鑰。為啥不用非對稱加密直接通信呢?前面說過,非對稱加密確實安全,但是它慢啊,而且非常慢。在保證了對稱加密證書的可靠性之後,對稱加密的通信也是安全的,那麼後面就可以直接用更高效的對稱加密通信了。

參考://www.cnblogs.com/scofi/p/6617394.html

參考://www.cnblogs.com/Leroscox/p/9627809.html