1. 程式人生 > >[Linux] 在 Linux CLI 使用 ssh-keygen 生成 RSA 金鑰

[Linux] 在 Linux CLI 使用 ssh-keygen 生成 RSA 金鑰

  RSA 是一種公鑰加密演算法,在 1977 年由麻省理工學院的%26nbsp;Ron Rivest, Adi Shamir, Leonard Adleman 三人一起提出,因此該演算法命名以三人姓氏首字母組合而成。

%26nbsp;

  SSH 是 Secure Shell 縮寫,是建立在應用層和傳輸層基礎上的安全協議,為計算機上執行的 Shell 提供安全的傳輸和使用環境。

%26nbsp;

  傳統的 rsh, FTP, POP 和 Telnet 網路協議因為傳輸時採用明文,很容易受到中間人方式攻擊。為了防止遠端傳輸資訊出現洩露,SSH 協議支援對傳輸的資料進行加密,因此它還能防止 DNS 和 IP 欺騙。另外採取 SSH 協議傳輸的資料可以進行壓縮,所以可以加快資料傳輸速度。最初 SSH 協議由芬蘭的%26nbsp;

Tatu Yl%26ouml;nen%26nbsp;在 1995 年設計開發,目前屬於 SSH Communications Security 擁有,由於版權原因,1999 年 10 月開源軟體 OpenSSH 被開發出來,它已成為事實上的 SSH 協議標準實現(SSH Communications Security 提供的 SSH 軟體使用不同於 OpenSSH 的私鑰格式),也是目前 Linux 標準配置。

%26nbsp;

基本框架

%26nbsp;

  SSH 協議主要分成三個協議:

  1. 傳輸層協議(The Transport Layer Protocol):傳輸層協議提供伺服器認證,資料機密性,資訊完整性等支援。

  2. 使用者認證協議(The User Authentication Protocol):使用者認證協議為伺服器提供客戶端的身份鑑別。

  3. 連線協議(The Connection Protocol):連線協議將加密的資訊隧道劃分成若干邏輯通道,提供給更高層應用協議使用。

%26nbsp;

驗證方式

%26nbsp;

  SSH 提供兩種安全驗證方式:

  1. 基於口令:客戶端使用賬號和口令登入伺服器,所有傳輸資料都會被加密。但可能存在偽造伺服器冒充真正的伺服器與客戶端進行互動,不能避免中間人攻擊。

  2. 基於金鑰:使用一對金鑰(私鑰 + 公鑰),將公鑰放置到伺服器註冊。當用戶從客戶端登入伺服器時,伺服器會接到使用金鑰(即註冊在伺服器的公鑰)進行安全驗證請求,伺服器首先比對從客戶端傳送過來的公鑰與在己方註冊的公鑰是否一致,如果一致,伺服器會使用該公鑰加密資料向客戶端發起 "挑戰"[1]

,從而避免中間人攻擊。

%26nbsp;

OpenSSH 提供的工具

%26nbsp;

  OpenSSH 提供了以下幾個工具:

  1. ssh:實現 SSH 協議,用以建立安全連線,它替代了較早的 rlogin 和 Telnet。

  2. scp, sftp:利用 SSH 協議遠端傳輸檔案,它替代了較早的%26nbsp;rcp。

  3. sshd:SSH 伺服器守護程序,執行在伺服器端。

  4. ssh-keygen:用以生成 RSA 或 DSA 金鑰對。

  5. ssh-agent, ssh-add:管理金鑰的工具。

  6. ssh-keyscan:掃描網路中的主機,記錄找到的公鑰。

生成金鑰對

%26nbsp;

  使用 ssh-keygen 生成一個金鑰對(私鑰 + 公鑰):

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/xavier/.ssh/id_rsa): id_rsa
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in id_rsa.
Your public key has been saved in id_rsa.pub.
The key fingerprint is:
ce:89:59:3d:a1:3a:99:b3:01:46:78:0f:d1:cc:d4:fa [email protected]X
The key's randomart image is:
+--[ RSA 2048]----+
|    .=..         |
|   . .+ .        |
|  . +  .  .      |
|   o o.  o .     |
|    o ..S o      |
|   . . XE. .     |
|      X +        |
|       =         |
|      .          |
+-----------------+

%26nbsp;

  ssh-keygen 預設使用 RSA 演算法,長度為 2048 位,生成一個私鑰檔案 id_rsa 和一個公鑰檔案 id_rsa.pub,兩個檔案預設儲存在使用者的 ~/.ssh 目錄下。你可以在命令列互動過程指定金鑰檔案路徑,也可以設定金鑰口令,如果設定了金鑰口令,在使用金鑰進行登入時,需要輸入口令。

%26nbsp;

  ssh-keygen 支援 -f 選項指定金鑰檔案路徑,-t 選項指定加密演算法,-b 選項指定金鑰長度,-N 選項指定金鑰口令,-C 選項指定註釋。

%26nbsp;

  只要將公鑰檔案 id_rsa.pub 提交給伺服器,讀取該檔案包含的字串並追加到伺服器端使用者的主目錄 ~/.ssh/authorized_keys 檔案中,持有私鑰的客戶端就可以使用 SSH 協議登入伺服器了。

%26nbsp;

  SSH 1 協議支援 RSA 演算法,SSH 2 協議支援 RSA 和 DSA 兩種演算法。ssh-keygen 使用 -t 選項來指明加密演算法,rsa1 表示支援 SSH 1,dsa, ecdsa, rsa 表示支援 SSH 2。

%26nbsp;

  生成支援 SSH 1 的 RSA 金鑰:

$ ssh-keygen -t rsa1 -f id-rsa1
Generating public/private rsa1 key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in id-rsa1.
Your public key has been saved in id-rsa1.pub.
The key fingerprint is:
c8:81:8f:dc:cd:ba:86:d2:56:e8:d5:13:3f:57:a5:f9 [email protected]X
The key's randomart image is:
+--[RSA1 2048]----+
|                 |
|     .          .|
|    . .        + |
|   . = =.     +  |
|    o.=.So   . . |
|    . o.o o .   E|
|   o +.  . o     |
|  . = ..         |
|   o ..          |
+-----------------+

%26nbsp;

  從私鑰檔案生成公鑰檔案:

$ ssh-keygen -y -f id-rsa
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDmg/9Hoc98c6AIlEPYK6VqE3ZTlMlfXqn2VgU0NAPXeRmYX+jHYZXA5AxMNTD8KgZIuilK23qzzKBy0hgoO9DDpsBg98Pf4NLkHjTcjpPFX1TBD6RWO/OX/g4uN+gZH1/zoREJa4fit8SSG2V2GoQkqrhfRYCy+a9mQX29ZvOLfYK/aMVjb+yfzLJychdvV3CQkDvkd5R/DHNU6ZQ3pyIEjA/cUQqqmgxQj0f72y8IXv8zesXtjXaaKG17R2oSN1MNDZo/y4m426MYxl4mMQMvM5yR3UvhD93pgNgaR8LY/vspcIeE6cJZsGl21oYtrDZ/GdmF5ulMGwjIDfTJRLvb

%26nbsp;

  修改私鑰檔案的註釋和口令(僅支援 RSA1,如果原 RSA1 檔案含有註釋或口令,才會提示修改相應的註釋或口令。):

$ ssh-keygen -c 
Enter file in which the key is (/home/xavier/.ssh/id_rsa): id-rsa1
Key now has comment 'Hello'
Enter new comment: HelloWorld
The comment in your key file has been changed.

%26nbsp;

  修改私鑰檔案口令(命令:ssh-keygen -p [-P old_password] [-N new_password] [-f keyfile])

$ ssh-keygen -p -f id-rsa
Key has comment 'id-rsa'
Enter new passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved with the new passphrase.

%26nbsp;

  如果想要取消口令,只需要在輸入密碼為空即可。私鑰口令只是對私鑰檔案的訪問許可權,修改和刪除口令並不影響私鑰內容。

%26nbsp;

公鑰指紋

%26nbsp;

  由於公鑰長度一般都是%26nbsp;1024 或 2048 個位元組,不方便進行比對,因此通常使用一個較短的字串來代表它,這個就是公鑰指紋。公鑰指紋的計算方法一般就是對公鑰字串進行 MD5 或者 SHA-1 等摘要計算得到,一個 1024 位元組長度的 RSA 演算法公鑰,經過指紋計算後得到的公鑰指紋只有 128(MD5摘要)位元組或者 160(SHA-1)位元組。

%26nbsp;

  你可以使用 ssh-keygen 工具來計算公鑰指紋:

$ ssh-keygen -l -f id_rsa.pub
2048 ce:89:59:3d:a1:3a:99:b3:01:46:78:0f:d1:cc:d4:fa  [email protected] (RSA)

%26nbsp;

  如果客戶端是第一次訪問伺服器,系統會提示以下資訊:

$ ssh [email protected]192.168.1.5
The authenticity of host '192.168.1.5 (192.168.1.5)' can't be established.
RSA key fingerprint is 1c:bb:f1:e5:40:34:75:d3:37:b7:8f:b3:4a:6f:b6:47.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.5' (RSA) to the list of known hosts.

%26nbsp;

  這是因為客戶端第一次連線目標伺服器,客戶端沒有目標伺服器的公鑰存根,因此係統告訴你目前正在連線的伺服器所使用的公鑰指紋(公鑰指紋代表著公鑰,但長度較短便於識別),需要你看看這個指紋是否正確,如果正確就正式建立連線,如果指紋可疑就不要建立連線。

%26nbsp;

  這個公鑰指紋是基於伺服器的公鑰計算而來,伺服器的公鑰一般儲存在 /etc/ssh/ssh_host_rsa_key.pub 檔案中。如果你事先知道伺服器公鑰,那麼你自然可以輕鬆識別指紋並決定是否建立連線,但如果是在網際網路中連線陌生伺服器,你並知道目標伺服器的公鑰,這樣就無法識別當前指紋是不是惡意的中間人伺服器提供的,為了解決這個問題,伺服器端管理員需要提前公示自己的公鑰,或者是從證書機構申請證書,使用者只要使用公示的公鑰,或者去頒證機構認證下載證書就可以識別當前連線的伺服器是否是虛假的中間人。

%26nbsp;

  一旦你確認指紋合法性並建立連線後,客戶端就會將伺服器的公鑰儲存在 $HOME/.ssh/known_hosts 檔案中,下次連線時系統自動將對方發過來的公鑰與已知公鑰進行比對,如果正確就直接建立連線,如果不正確將給出警告提示說公鑰不匹配並阻止建立連線。

%26nbsp;

  當由於公鑰不匹配而無法建立連線時,可能有幾個原因,一是目標伺服器更換了公鑰;二是目標伺服器更換了 IP 地址或者域名,導致你連線到其他主機致使公鑰不匹配;三是有惡意攻擊者截斷了連線,正在使用偽造的主機地址試圖欺騙你建立連線。無論是哪個原因,你都應該保持警惕,謹慎建立連線。

%26nbsp;

注:

[1] "挑戰" 是指伺服器使用公鑰加密資料傳送給客戶端,客戶端使用配對的私鑰對資料進行解密,客戶端成功解密後將答案發回伺服器進行驗證,結果一致則挑戰成功,表示客戶端是合法使用者可以進行安全通訊。

%26nbsp;

附:

1. RSA 演算法

相關推薦

[Linux] 在 Linux CLI 使用 ssh-keygen 生成 RSA

  RSA 是一種公鑰加密演算法,在 1977 年由麻省理工學院的%26nbsp;Ron Rivest, Adi Shamir, Leonard Adleman 三人一起提出,因此該演算法命名以三人姓氏首字母組合而成。 %26nbsp;   SSH 是 Secure Shell 縮寫,是建立在應用層和傳輸層

Linux系統用ssh-keygen生成公私

專案開發過程中我們經常需要用git從遠端程式碼庫拉取程式碼到本地,或者需要從一臺伺服器端登入另一臺伺服器,這些情況下都需要知道遠端程式碼庫或者伺服器的賬號和密碼。有沒有一種方法可以不用每次連線遠端機器的時候都輸入賬號和密碼呢?答案是有的,這就是利用ssh-keygen生成本

N天學習一個linux命令之ssh-keygen

IE provides filename mes pll pub cif sts key 用途 生成ssh加密算法需要使用到的秘鑰以及管理和轉換 用法 ssh-keygen [-q] [-b bits] -t type [-N new_passphrase] [-

SecureRandom生成“強隨機數”用於生成RSA*公/私*window和linux下不一致的問題

1.先說下問題: 由於我們的服務部署環境是兩臺伺服器,在服務啟動時生成RSA金鑰對。這有一個問題:當兩臺機器分別啟動時,生成了不同的金鑰對。而當客戶端需要用到RSA加解密的時候,連結可能會被負載到另一臺機器上,造成解密失敗,丟擲異常。 2.看下之前的程式碼(

ssh-keygen生成公私免密碼登錄遠程服務器

改名 輸入密碼 需要 很多 auth 文件夾 登錄 以及 企業 1.終端輸入命令:ssh-keygen -t rsa 定要創建的密鑰類型。可以使用:"rsa1"(SSH-1) "rsa"(SSH-2) "dsa"(SSH-2) -N new_passphrase

ssh-keygen -t rsa -b 4096 -C "郵箱"

來看 個人 comm 創建 blank ssh登錄 冒充 必須 hal ssh-keygen -t rsa -b 4096 -C "郵箱":這條命令的目的是為了讓本地機器ssh登錄遠程機器上的GitHub賬戶無需輸入密碼。將這條命令分解: 1、ssh-keygen: S

Linux遠程ssh免密碼,秘登錄

bsp 文件名 span ins class chm yum zed 是否 Linux系統做免密,秘鑰登錄要註意一下幾點: /root/.ssh目錄權限為700 SELinux要關閉 /root/.ssh/authorized_keys文件名要寫對 文件內容要粘貼對

【Git】Git免密登入,使用ssh-keygen生成多個key分別用於公司的gitlab和自己的github倉庫

一、在git bash中執行 ssh-keygen -t rsa -C ‘[email protected]’ -f ~/.ssh/id_rsa_xxx 二、新增配置 在使用者目錄的.ssh目

ssh 遠端登入 不用密碼設定方法 ssh-keygen -t rsa

ssh-keygen 用來生成ssh登入的key,可以使我們以後登入遠端主機時無需再輸入遠端主機的key. 具體使用方法如下: 例如我們有兩臺主機: A:192.168.0.1   B:192.168.0.2 當我們需要用主機A登入遠端主機B時,我們在主機A上輸入

利用ssh-keygen生成 SSH Key

我們在使用分散式版本控制工具Git時,遠端程式碼的管理是基於SSH協議的,故如果要遠端操作Git則需要配置SSH。 1、設定Git的使用者名稱和郵箱地址 git config --global user.name "lql" git config --global user

Python rsa公私生成 rsa加密(分段加密)私加簽實戰

you port pen man length comment 數據加密 自己 keygen 一般現在的SAAS服務提供現在的sdk或api對接服務都涉及到一個身份驗證和數據加密的問題。一般現在普遍的做法就是配置使用非對稱加密的方式來解決這個問題,你持有SAAS公司的公鑰,

用openssl生成rsa

openssl rsa 生成私鑰openssl genrsa -out rsa_1024_pri.pem 1024生成公鑰openssl rsa -pubout -in rsa_1024_pri.pem -out rsa_1024_pub.pem用openssl生成rsa密鑰對

如何使用openssl生成RSA和私

在ubuntu上要使用openssl的話需要先進行安裝,命令如下: sudo apt-get install openssl 安裝完成就可以使用openssl了。 首先需要進入openssl的互動介面,在命令行了輸入openssl即可; 1)生成RSA私鑰:

java生成RSA公私字串,簡單易懂

java生成RSA公私鑰字串,簡單易懂   解決方法: 1.下載bcprov-jdk16-140.jar包,參考:http://www.yayihouse.com/yayishuwu/chapter/1537 2.java程式碼 KeyPairGenerator

使用openssl生成RSA和私

在ubuntu上要使用openssl的話需要先進行安裝,命令如下: #sudo apt-get install openssl #openssl 首先需要進入openssl的互動介面,在命令行

生成rsa 公私

生成私鑰 openssl genrsa -out rsa_private.key 1024 私鑰(pkcs1) openssl rsa -in rsa_private.key -pubou

NetCore 生成RSA公私對,公加密私解密,私加密公解密

using Newtonsoft.Json; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Encodings; using Org.BouncyCastle.Crypto.Engines; using Org.BouncyCastl

使用OpenSSL生成RSA和私

Windows下生成RSA公鑰和私鑰 開啟 openssl 資料夾下的 bin 資料夾,執行 openssl.exe 檔案 生成 RSA 私鑰,出現圖中提示說明生成成功 genrsa -out

利用Python Crypto生成RSA

# -*- coding: utf-8 -*- from Crypto import Random from Crypto.PublicKey import RSA print "generate private key and pulic key" # 參考 C:\

golang 生成RSA和私檔案

package main import ("crypto/rand""crypto/rsa""crypto/x509""encoding/pem""os" ) func main() {//rsa 金