建立 RSA 金鑰以啟用 SSH 存取,仰賴公開金鑰認證的交握過程:伺服器持有公開金鑰,用戶端則證明自己擁有對應的私密金鑰。RSA Key Generator 雖然能產生一組有效的 RSA 金鑰對,但其匯出格式是 RSA-OAEP 包裝在標準 PEM 信封中,而不是 sshd 與 ssh-keygen 所期望的 OpenSSH 行格式。這個差異至關重要,因為啟用 SSH 存取不只需要任何一組 RSA 金鑰對,而是必須使用 OpenSSH 實作能夠讀取的格式所編碼的 RSA 金鑰。瀏覽器工具解決了較困難的密碼學部分:它會產生全新的 2048 位元或 3072 位元 RSA 模數、指數 65537,以及 SHA-256 OAEP 參數,然後將公開端匯出為 SubjectPublicKeyInfo (SPKI) PEM,將私密端匯出為未加密的 PKCS#8 PEM。要銜接到 SSH,通常意味著使用其他工具將這些信封轉換成 OpenSSH 格式,或是在需要進行認證的系統上直接使用 ssh-keygen 產生 SSH 金鑰。當你希望在瀏覽器中取得一組可驗證的 RSA-OAEP 金鑰對而無需上傳到伺服器,並且在將私密金鑰提交到長期保存的密鑰儲存區之前想了解其背後的數學原理時,RSA Key Generator 就能派上用場。

啟用 SSH 存取實際上需要什麼
SSH 公開金鑰認證使用的是一組非對稱金鑰對,但其傳輸與儲存格式採用的是 OpenSSH 專屬、以行為導向的表示方式,而非通用的 PEM。典型的 authorized_keys 行會以演算法標籤開頭,例如 ssh-rsa 或 rsa-sha2-256,後面接著 Base64 編碼的金鑰內容與選擇性的註解。私密端則以 OpenSSH 私密金鑰(檔案開頭為 -----BEGIN OPENSSH PRIVATE KEY-----)儲存,或是在尚未支援 OpenSSH 格式的系統上,使用 ssh-keygen -m PEM 產生的舊式 PEM 形式來儲存。
其底層數學仍是 RSA,模數大小以目前的伺服器標準來說至少需要 2048 位元。OpenSSH 傳輸格式會對模數與公開指數進行編碼,而私密金鑰則額外包含 d、p、q 以及用來加速簽章的 CRT 參數。這些位元組看起來都與瀏覽器版 RSA Key Generator 所輸出的 PEM 信封完全不同,這也是為什麼剛產生的 SPKI/PKCS#8 金鑰對無法直接取代 authorized_keys 項目。
瀏覽器工具所能提供的是 RFC 7468 中定義的標準 ASN.1 信封(用於包裝),以及 RFC 8017 中定義的 RSA 基本運算。這個基礎可在 TLS 函式庫、Java 的 KeyFactory、Python 的 cryptography 套件,以及大多數可直接讀取 PEM 的 HSM 廠商 SDK 之間通用。
RSA Key Generator 在你的瀏覽器中會產生什麼
RSA Key Generator 是一個單頁工具,會要求平台的 Web Cryptography 實作以 SHA-256、模數長度 2048 或 3072,以及固定的公開指數 65537,為 RSA-OAEP 執行 generateKey。產生過程是非同步的;較大的 3072 位元模數會耗費明顯較久的時間,因為瀏覽器必須找到兩個大小合適的大質數,再執行擴展歐幾里得步驟以推導出私密指數。
一旦產生完畢,公開金鑰會以 DER 匯出、以 64 欄寬進行 Base64 包裝,並標記為 BEGIN PUBLIC KEY —— 也就是來自 X.509 的 SubjectPublicKeyInfo 結構。私密金鑰則以 PKCS#8 DER 匯出,並標記為 BEGIN PRIVATE KEY,不附加任何密碼信封。不會有任何金鑰位元組被傳送到任何應用程式伺服器;整個工作流程都在你所開啟的分頁中執行。這種隔離雖然有意義,但並不延伸到擴充功能、惡意程式、剪貼簿管理員、截圖工具或瀏覽器同步功能 —— 該頁面只能保證平台 API 對其自身緩衝區所做的事情。
| 格式 | 來源 | 是否可用於 SSH | 信封標頭 |
|---|---|---|---|
| OpenSSH authorized_keys 行 | ssh-keygen、PuTTYgen | 可以 | 純 Base64,帶有 ssh-rsa 前綴 |
| OpenSSH 私密金鑰 | ssh-keygen | 可以(ssh-agent 原生支援) | -----BEGIN OPENSSH PRIVATE KEY----- |
| SPKI 公開金鑰 PEM | RSA Key Generator | 需重新編碼後才能使用 | -----BEGIN PUBLIC KEY----- |
| PKCS#8 私密金鑰 PEM | RSA Key Generator | 需重新編碼後才能使用 | -----BEGIN PRIVATE KEY----- |
這個工具刻意將這些格式區隔開。它不會進行簽章、不會產生 CSR,也不會自行發明 SSH 傳輸信封,因為該傳輸信封屬於另一個通訊協定層級。
逐步產生金鑰對
- 確認目的端期望的是 RSA-OAEP 搭配 SHA-256 與 SPKI/PKCS#8 PEM。閱讀消費端函式庫的文件或原始碼,驗證其演算法名稱與所接受的金鑰信封。若消費端本身就是 OpenSSH,請在此停止並改用 ssh-keygen;這個工具無法自行產生可用的 SSH 金鑰。
- 選擇 2048 或 3072 位元並產生。若需廣泛的相容性與更快的瀏覽器效能,請使用 2048;若希望獲得更高的安全邊際且消費端支援,則改用 3072。按下按鈕是非同步進行的,且任務識別碼可避免較舊的請求覆蓋較新的請求,因此在頁面顯示出兩個 PEM 區塊之前,請勿關閉或操作該分頁。
- 將公開的 SPKI PEM 複製到消費端。該區塊以 -----BEGIN PUBLIC KEY----- 開頭,可放心分享給任何需要為持有者加密資料的系統。依據消費端的期待,將其載入設定檔、資料庫欄位或 LDAP 屬性中。
- 將 PKCS#8 私密 PEM 匯入受保護的儲存區。由於該 PEM 未以密碼加密,請將其視為已外洩的秘密資料。請直接將其貼上至密鑰管理工具、HSM 匯入流程或加密的 keystore 中。切勿將其貼上至原始碼控制、聊天、票務系統、分析工具或筆記中。
- 清除剪貼簿並關閉分頁。一旦私密金鑰進入密鑰管理工具,請清除所有剪貼簿殘留並關閉該頁面,以釋放記憶體中的緩衝區。
- 執行端對端加密測試。在消費端使用公開金鑰加密一筆已知的 UTF-8 訊息,將密文傳送至持有私密金鑰的處理程序,並斷言其能完整還原。能成功匯入 PEM 並不代表足夠 —— OAEP 標籤與遮罩產生(mask-generation)設定也必須相符,且匯入後的演算法必須回報所選取的模數長度。
若你的最終目標是 SSH 存取而非 RSA-OAEP 加密,產生金鑰後最簡潔的做法是使用輔助工具將 SPKI PEM 轉換為 OpenSSH 公開金鑰,或在實際需要金鑰的主機上執行 ssh-keygen -t rsa -b 3072。這兩種做法都能產生 SSH 守護程序可接受的金鑰。如需更深入的瀏覽器與原生路徑比較,請參閱這份不依賴 ssh-keygen 在瀏覽器中建立 RSA 金鑰的操作指南。
為什麼 RSA-OAEP PEM 金鑰無法直接用於 SSH
OpenSSH 定義了自己的金鑰編碼方式,以便在 RSA 參數之外攜帶通訊協定專屬的中繼資料,並能在不破壞舊版部署的情況下,於 rsa-sha2-256、rsa-sha2-512 與舊版 ssh-rsa 簽章演算法之間輪替。RSA Key Generator 所輸出的 PEM 信封宣告的是用於加密的 RSA-OAEP 金鑰,而非 RSA 簽章金鑰,因此即便底層 PKCS#8 主體帶有所有 RSA 私密金鑰皆應具備的標準 n、e、d、p、q 與 CRT 參數,OpenSSH 傳輸格式仍無法讀取。
實務上,當目的端是 SSH 時,最安全的做法是直接使用 SSH 工具鏈產生金鑰,並將瀏覽器工具保留給 RSA-OAEP 加密工作流程中使用 —— 在這些情境下,消費端確實是以 PEM 進行通訊。兩種能受惠於 SPKI/PKCS#8 PEM 的工作流程,分別是使用 RSA-OAEP 保護一把對稱資料金鑰,以及在已將 SPKI/PKCS#8 作為線上傳輸格式的系統之間交換小型資料。
在以 SSH 為重點的工作流程中,RSA Key Generator 仍可作為學習與驗證步驟而佔有一席之地。產生一組金鑰對、將其匯回 Web Crypto、加密一個 UTF-8 字串、再解密回來,整個來回測試能確認你交給密鑰管理工具的私密金鑰位元組是有效的。這個測試能在金鑰進入正式環境之前,先行抓出截斷、Base64 填補錯誤以及不小心調換標頭等問題。
金鑰產生後的私密金鑰保護
沒有密碼信封的 PKCS#8 PEM 對任何讀取該檔案的人來說,都是明文形式的秘密資料。任何持有它的人都能解密該公開金鑰曾經加密過的所有密文,這也是為什麼私密端必須直接從產生器進入密鑰管理工具,期間不得複製貼上到聊天、支援工單或原始碼儲存庫。
最佳實務是將匯入步驟視為單一不可分割的動作:開啟密鑰管理工具、貼上、儲存、關閉產生器分頁,然後清除剪貼簿紀錄。瀏覽器擴充功能、剪貼簿管理員與截圖工具都在頁面掌控範圍之外,因此裝置本身必須經過修補並值得信賴。對於團隊工作流程,建議每個身分識別產生一次金鑰,一旦疑似外洩應立即輪替。
產生器也將指數固定為 65537。這個選擇避免了可能引入細微漏洞的特殊指數,移除了幾乎用不上的調整參數,並使每一組產生的金鑰對都與主流 TLS 與 RSA-OAEP 函式庫所預期的參數預設值一致。若消費端堅持使用非預設指數,請將此視為警訊並在匯入前加以確認。
若消費端其實就是 SSH 本身,請將 RSA Key Generator 保留在你的工具組中,用於非 SSH 的 RSA-OAEP 工作;只有在確認消費端能讀取 SPKI/PKCS#8 PEM 之後,才使用瀏覽器版 RSA 金鑰流程。對於 SSH 存取,請在需要登入的主機上使用 ssh-keygen 產生金鑰,將產生的公開金鑰複製到 authorized_keys,並將 OpenSSH 私密金鑰保存在 ssh-agent 或硬體權杖之中。
如需更深入的瞭解,請參閱 XOR 加密 API 替代方案:瀏覽器端重複金鑰。