文章目錄
rsa簡介
rsa
什麼是rsa
RSA加密算法是一種非對稱加密算法。在公開密鑰加密和電子商業中RSA被廣泛使用。它的基本原理是利用大數難以質因數分解,它有一對數字:
- 密鑰(yao4):絕對不能透露給別人。
- 公鑰:是要給別人的。
具體原理請見阮一峯的blog
rsa的用途
身份驗證
所謂"公鑰登錄",原理很簡單,就是用戶將自己的公鑰儲存在遠程主機上。登錄的時候,遠程主機會向用戶發送一段隨機字符串,用戶用自己的私鑰加密後,再發回來。遠程主機用事先儲存的公鑰進行解密,如果成功,就證明用戶是可信的,直接允許登錄shell,不再要求密碼。
數字簽名
數字簽名用於發行軟件時防止別人篡改,具體流程是這樣的:
-
發行者對文件進行hash校驗,並把這個校驗值和進行私鑰加密得到數字簽名,大家通過公佈在網站上的公鑰解開這段密文(數字簽名),也就是文件的hash值。
-
下載者對文件進行hash校驗,和1.中得到的hash值進行比對。
上面兩個步驟如何防止第三方修改,發行者加密的文件第三方當然可以通過公鑰解密之後修改,但是你也無法生成(到時候用戶要用公佈在網站上的公鑰解密的)數字簽名(必須知道密鑰)。
ssh用rsa方式登錄遠程主機
爲什麼要用rsa登錄
- 方便,每次登錄不用輸密碼。
- 安全,禁用密碼登錄後,不怕別人猜到密碼。
文件信息
本文會涉及兩個文件夾,一個是在客戶端(client),一個是服務器端(server):
- rsa 密鑰位置(client):
~/.ssh/
- ssh 配置文件(server):
/etc/ssh/sshd_config
client 和 server 是相對的概念,在一次連接中,主動尋求連接的是 client ,被連的是 server。
操作
client
- 生成密鑰對: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
: 公鑰
# 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
/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
#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的。