為 SSH 產生私鑰+公鑰對:ssh-keygen 和 openssl 之間的差異?

為 SSH 產生私鑰+公鑰對:ssh-keygen 和 openssl 之間的差異?

我想創建用於 SSH 身份驗證的私鑰和公鑰對。

我無法弄清楚這之間的區別:

openssl genrsa -out MyPrivateKey 4096
openssl rsa -in MyPrivateKey -pubout -out MyPublicKey

它首先建立一個 RSA 私鑰,然後從中衍生出公鑰,或:

ssh-keygen -b 4096 -t rsa -f MyFancyKey

它在檔案“MyFancyKey”中建立一個 RSA 私鑰,並在“MyFancyKey.pub”中建立相應的公鑰。

私鑰的結構似乎有些相似,儘管創建的私鑰的openssl開頭是:
-----BEGIN RSA PRIVATE KEY-----

開頭ssh-keygen是:
-----BEGIN OPENSSH PRIVATE KEY-----

這兩種鍵有根本的差別嗎?


然後是相應的公鑰,其中openssl包含:

-----BEGIN PUBLIC KEY-----
  ...base64 encoded...
-----BEGIN PUBLIC KEY-----

而其中的一個只ssh-keygen包含一行:
ssh-rsa XXXXXX...base64 encoded...XXXXX [email protected]

這些本質上是相同類型的數據,但格式不同嗎?還是他們真的不相容?

我試圖完全理解所有這些與 SSH 相關的工作原理。例如,為什麼我的使用者名稱、我的電腦名稱和我的本機網路名稱在該金鑰中,它通常不應該用於存取 SSH其他電腦?使用我在那台電腦上的用戶名,而不是我自己的用戶名。

答案1

私鑰

這兩種鍵有根本的差別嗎?

不,它們本質上是相同的數據。

  • BEGIN RSA PRIVATE KEY表示「PKCS#1」或「PEM」金鑰格式,它是 ASN.1 DER 序列化結構的 Base64 編碼。它是包含 RSA 參數的基本 ASN.1 序列(n,e,d,p,q, ETC)。

    這種格式來自 PEM 電子郵件安全工作,後來成為 S/MIME(因此使用了 ASN.1 DER),並且通常用於 SSL/TLS 以及各種通用 RSA。

    長期以來,它也是 OpenSSH 的主金鑰格式(因為 OpenSSH 已經使用了 OpenSSL 的加密程式碼,因此「載入金鑰」和「寫入金鑰」功能也可以方便使用)。這意味著您可以使用它ssh-keygen -m PEM來產生或轉換此類金鑰。

  • BEGIN PRIVATE KEY表示“PKCS#8”金鑰格式(未加密);它的內容與 PEM 格式非常相似,相同的 RSA 參數嵌套在另一個結構中,顯示它確實是 RSA 金鑰。

    PKCS#8 是 PEM 格式的更現代的替代品。與 PEM 相比,PKCS#8 格式更清晰地將「有效負載」(金鑰演算法、加密)與外部 Base64 包裝器分開 - 所有元資料現在都位於結構內部,因此更容易更新新金鑰類型。新格式還支援更好的加密金鑰密碼和 KDF。

    OpenSSH 也會識別這種格式(因為它使用 OpenSSL 進行金鑰載入),而且我認為最近的版本也能夠創建它。

  • BEGIN OPENSSH PRIVATE KEY是 OpenSSH 為 OpenSSH 發明的一種格式,與 PEM/PKCS 格式不同,它的資料結構使用 SSHv2 資料包序列化(不再有 DER 或 ASN.1)。

    OpenSSH 現在使用這種格式的原因之一是,它可以避免完全依賴 OpenSSL,和/或可以添加新的金鑰演算法,而無需等待 OpenSSL 實現這些金鑰的載入/保存 - 這也意味著等待 PKIX 標準化每個新演算法的ASN.1 OID 和結構(否則與SSH 完全無關)。

    例如,OpenSSL 花了一段時間才獲得完整的 Ed25519 支持,在此期間,OpenSSH 既無法使用 OpenSSL 的 libcrypto 進行實際數學運算,也無法加載/保存 Ed25519 密鑰檔案 - 這就是促使創建此格式的原因。

    OpenSSH 格式的另一個優點是密碼加密金鑰使用 bcrypt 來衍生加密金鑰;當時PEM格式僅限於非常弱(即容易暴力破解)的KDF,甚至PKCS#8也只支援稍遜一籌的PKBDF2。

  • PuTTY 有自己的.ppk格式,主要是基於文字的。

    它聲稱的優點是不需要單獨的.pub 文件,因為它只選擇性地加密私有參數- 而早期的PKCS 格式和後來的OpenSSH 格式都加密所有內容或不加密任何內容,因此它們需要.pub 文件,以便它們可以在要求您提供解鎖密碼之前提供密鑰。

    您可以用來/usr/bin/puttygen在所有這些格式之間進行轉換。

  • Java 軟體可能使用 PKCS#12 (PFX) 格式,因為它是本機「Java 金鑰庫」格式,某些軟體甚至可能使用 SSH.COM 所謂的標準格式。

也可以看看:OpenSSH 公鑰檔案格式?

公鑰

這些本質上是相同類型的數據,但格式不同嗎?

是的,它們本質上是相同的數據。

  • BEGIN PUBLIC KEY我相信,也是 PKCS#8 – 所以在 Base64 內部有一個 DER 序列化的 ASN.1 結構,它將其標識為 RSA 密鑰,後面跟著關鍵參數(n,e)。

  • 儘管中央 Base64 編碼資料與 SSHv2 協定本身(「線上」)中使用的格式完全相同,但單行格式部分是 OpenSSH 特定的。正如您可能猜到的,編碼資料使用 SSHv2 資料包序列化 - 但它仍然保留相同的 RSAne價值觀。

也可以看看:OpenSSH 公鑰檔案格式?

例如,為什麼我的使用者名稱、我的電腦名稱和我的本機網路名稱會在該鍵中

這是一則評論當您有一個長文件時,可以幫助您將該公鑰與其他公鑰區分開來authorized_keys

相關內容