ssh免密登錄遠程主機(by rsa)


rsa簡介

rsa

什麼是rsa

RSA加密算法是一種非對稱加密算法。在公開密鑰加密和電子商業中RSA被廣泛使用。它的基本原理是利用大數難以質因數分解,它有一對數字:

  1. 密鑰(yao4):絕對不能透露給別人。
  2. 公鑰:是要給別人的。

具體原理請見阮一峯的blog

rsa的用途

身份驗證

所謂"公鑰登錄",原理很簡單,就是用戶將自己的公鑰儲存在遠程主機上。登錄的時候,遠程主機會向用戶發送一段隨機字符串,用戶用自己的私鑰加密後,再發回來。遠程主機用事先儲存的公鑰進行解密,如果成功,就證明用戶是可信的,直接允許登錄shell,不再要求密碼。

數字簽名

數字簽名用於發行軟件時防止別人篡改,具體流程是這樣的:

  1. 發行者對文件進行hash校驗,並把這個校驗值和進行私鑰加密得到數字簽名,大家通過公佈在網站上的公鑰解開這段密文(數字簽名),也就是文件的hash值。

  2. 下載者對文件進行hash校驗,和1.中得到的hash值進行比對。

    上面兩個步驟如何防止第三方修改,發行者加密的文件第三方當然可以通過公鑰解密之後修改,但是你也無法生成(到時候用戶要用公佈在網站上的公鑰解密的)數字簽名(必須知道密鑰)。

ssh用rsa方式登錄遠程主機

爲什麼要用rsa登錄

  1. 方便,每次登錄不用輸密碼。
  2. 安全,禁用密碼登錄後,不怕別人猜到密碼。

文件信息

本文會涉及兩個文件夾,一個是在客戶端(client),一個是服務器端(server):

  • rsa 密鑰位置(client):~/.ssh/
  • ssh 配置文件(server):/etc/ssh/sshd_config

client 和 server 是相對的概念,在一次連接中,主動尋求連接的是 client ,被連的是 server。

操作

client

  1. 生成密鑰對:rsa 和 rsa.pub
ssh-keygen -t rsa

得到

Generating public/private rsa key pair.
# 輸入rsa對(`id_rsa`和`id_rsa.pub`)名稱(帶路徑)
Enter file in which to save the key (/home/user/.ssh/id_rsa):
# 輸入密碼,使用rsa密鑰時(這裏就是登錄遠程主機時)用的
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

將會生成

  • rsa: 密鑰
  • rsa_rsa.pub: 公鑰
  1. rsa.pub附加到server ~/.ssh/authorized_keys的文件內
# Following 2 codes are excuted on client
ssh-copy-id [-i ~/.ssh/rsa.pub] user@host
# or
ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub

一個粗暴的辦法,複製client內的id_rsa.pub的內容,登錄server,附加到~/.ssh/authorized_keys

server

  1. /etc/ssh/sshd_config 的配置
PubkeyAuthentication yes
AuthorizedKeysFile	.ssh/authorized_keys #.ssh/authorized_keys2
PasswordAuthentication yes

可以找到相應的項並取消註釋。

參數 解釋
PubkeyAuthentication yes 允許公鑰登錄
AuthorizedKeysFile .ssh/authorized_keys #.ssh/authorized_keys2 由 client 生成的公鑰,可以添加多個
PasswordAuthentication yes 是否允許用密碼登錄
(禁用後,如果密鑰丟失就不能登錄遠程主機了)

可能你的系統用的是第一版ssh協議需要添加 RSAAuthentication yes 這一項來允許rsa方式登錄,或者在/etc/ssh/sshd_config添加

Protocol 2

更多詳細幫助見man sshd_config

  1. 重啓遠程主機的ssh服務
#ubuntu系統
service ssh restart

#debian系統
/etc/init.d/ssh restart

附:不用輸入name@ip的方法——~/.ssh/config的配置

Host ubuntu
	HostName X.X.X.X
	Port 22
	User name
	IdentityFile ~/.ssh/id_rsa
參數 意思
HostName 192.168.1.2 遠程主機 ip, ssh name@ip 中的ip
Port 22 遠程主機 端口號(port), 默認是22,termux: 8022
User name 登錄名, ssh name@ip 中的name
IdentityFile ~/.ssh/id_rsa rsa密鑰,對應的公鑰放在server上了
  • 更多參數詳見幫助man ssh_config

這樣就可以直接通過

ssh ubuntu

來登錄遠程主機

附:ssh-keygen 公鑰如果丟失,由私鑰生成公鑰

ssh-keygen -y -f id_rsa > id_rsa.pub

生成的id_rsa.pub 相比於自動生成的少了最後一項,但是沒關係因爲rsa.pub格式
一般分爲三部分:密鑰類型、base64編碼後的密鑰、註釋(可選)。中間用空格分開。

附:ssh 時的fingerprint作用

$ ssh localhost
The authenticity of host 'localhost (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:o2cGXCQtdhvWUXG8liYGWJrhVuP4YF9/E839KY1HqH4.
Are you sure you want to continue connecting (yes/no)?

這個是爲了防止我連接的server不是我想連的server,有可能是假的。這個fingerprint是用來確認server的身份的。這個就是我們之前提到的rsa公鑰,只不過這次的fingerprint是server的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章