錯誤訊息(如有)是什麼?
Couldn't connect with these settings
SSH connection failed: Cannot parse privateKey: Unsupported key format
描述
我嘗試在認證中設置「SSH 私鑰帳戶」。當我將密鑰傳遞到「私鑰」欄位時,總是收到該錯誤訊息。
似乎此欄位破壞了密鑰的換行符。當我將其作為表達式傳遞時
={{`-----BEGIN RSA PRIVATE KEY-----
*PEM-Format (RSA 4096-Bit)*
-----END RSA PRIVATE KEY-----
`}}
它似乎在新認證對話框的檢查程序中有效。
但是:當我在 SSH 節點中使用認證時,我又得到相同的錯誤。
當我回到認證時,私鑰欄位的內容已變更為類似 __n8n_BLANK_VALUE_e5362baf-c777-4d57-a609-6eaf1f9e87f6 的內容。
當我輸入密鑰作為表達式、關閉認證窗口並立即重新打開時,也會發生相同的情況。然後密鑰檢查也會失敗。
在 n8n 中如何儲存 SSH 密鑰而不被破壞?
工作流程
關於您的 n8n 設置的資訊
- n8n 版本:2.30.7
- 資料庫(預設:SQLite):預設
- n8n EXECUTIONS_PROCESS 設置(預設:own、main):預設
- 透過以下方式執行 n8n(Docker、npm、n8n cloud、桌面應用程式):Docker/CasaOS
- 作業系統:Ubuntu 26.04 LTS
嗨 @Me.MyBase
查看您提供的 JSON,您正在嘗試使用 base64 解碼和 shred 在「執行命令」節點內手動處理金鑰檔案。
與其在指令檔案中手動管理基於檔案的金鑰,不如將 SSH 金鑰儲存在 n8n 中適當的 SSH 私密金鑰認證,並在 SSH 節點的身份驗證設定中選擇該認證,這樣要安全得多且穩定得多。
如果即使使用格式正確的 PEM 金鑰仍然收到「不支援的金鑰格式」錯誤,請確保該金鑰沒有密碼,或者如果有密碼,請確保您在認證設定的「密碼」欄位中正確輸入了密碼。
關於您在重新開啟認證時看到的 __n8n_BLANK_VALUE_xxx,需要澄清一下:這是正常且預期的行為,不是數據丟失。基於安全考量,n8n 在保存後絕不會將敏感字段(密碼/私鑰)的真實值返回給瀏覽器——它會改為顯示一個佔位符令牌。該密鑰確實存儲在服務器端;您在屏幕上看到的內容並非其真實內容。
真正的問題來自於使用表達式來填充該字段:
={{`-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----
`}}
「私鑰」字段是一個簡單的多行文本區域:完全無需通過表達式來保留換行符。直接粘貼密鑰(Ctrl+V),保留其真實的換行符——這樣可以正常運作。在此處使用表達式會混淆運行時解析邏輯與敏感字段遮蔽,這可能解釋了為什麼 SSH 節點嘗試解析該值時會失敗。
如果直接粘貼後換行符似乎仍被壓平,請檢查源密鑰:先將其粘貼到純文本編輯器中,以確認它確實包含真實的換行符(而非字面的 \n)——然後再粘貼到 n8n 中。某些密碼管理器或終端在導出時會將 PEM 格式壓縮到一行。
感謝您讓我們了解這一點,我們已建立 CV-16 作為內部開發工單來處理此問題。
嘿!你碰到了一個相當臭名昭著的 n8n 怪癖:直接在認證 UI 中儲存多行 SSH 私鑰。
你關於該欄位變成 __n8n_BLANK_VALUE_... 的觀察完全正確。這是 n8n 遮蓋已儲存認證的方式,但當你重新開啟節點時,它經常會破壞多行字串(如 RSA 金鑰)的序列化,導致「Unsupported key format」錯誤。
最穩健的解決方案是使用環境變數來繞過這些解析問題。以下是針對你的 Docker/CasaOS 設定的修復方法:
1. 準備你的私鑰(單行)
將 PEM 檔案中的實際換行符替換為 \n。應該看起來像這樣(保留引號):
"-----BEGIN RSA PRIVATE KEY-----\nMIICdgIBADANBgkqhkiG9w...\n-----END RSA PRIVATE KEY-----"
2. 設定環境變數
在你的 CasaOS 應用程式設定(或 docker-compose.yml)中,新增一個環境變數:
名稱:N8N_SSH_PRIVATE_KEY
值:[你的第 1 步中的單行金鑰]
儲存並重新啟動 n8n 容器。
3. 更新你的 n8n 認證
在 n8n 中建立新的 SSH 私鑰帳戶。在「私鑰」欄位中,不是直接貼上金鑰,而是使用運算式來參考你的新環境變數:
={{ $env.N8N_SSH_PRIVATE_KEY }}
這在運行時將格式正確的原始金鑰注入到 SSH 客戶端中,完全繞過 UI。它應該能立即運作。
嗨 @Me.MyBase 歡迎!
「不支援的金鑰格式」是 ssh2 解析器拒絕金鑰內容,而不是欄位破壞你的換行符。n8n 的 SSH 認證需要 OpenSSH 格式的金鑰,而你的是傳統 PEM 金鑰(-----BEGIN RSA PRIVATE KEY-----),該解析器不會接受。就地轉換,使用相同的金鑰對,讓伺服器的 authorized_keys 保持有效,並移除密碼短語,這樣在解析時就不需要解密:
ssh-keygen -p -N "" -f ./id_rsa
標題應該變成 -----BEGIN OPENSSH PRIVATE KEY-----。貼上轉換後的完整金鑰,包含標題和頁尾行,並將「密碼短語」欄位留空。
你好,感謝你的回覆。
SSH 節點中的內容不是問題。我無法將 SSH 私鑰以可用的方式儲存在認證中。該節點中的步驟目前仍在測試階段,現在還沒有實際應用。
你好,感谢你的回复。在所提及的版本中,私密密钥字段就是单行的,而不是多行的。这就是为什么我使用了这个表达式的技巧,它在验证中看起来确实有效。只有当我使用凭证时,它才会再次失败。
我也嘗試過純粹的 openSSL 格式,結果相同。我把它放在「Private Key」欄位中,使用固定值(沒有表達式)
-----BEGIN PRIVATE KEY-----
*openssl genrsa* 生成的 RSA 4096
-----END PRIVATE KEY-----
-----BEGIN PRIVATE KEY----- 是 PKCS#8,SSH 節點後面的 ssh2 解析器也不接受,所以嘗試在檢查欄位之前就因格式失敗。你要的標頭是 -----BEGIN OPENSSH PRIVATE KEY-----。
由於該欄位在你的版本中會展平金鑰,直接寫入認證資訊,而不是貼上。將現有的認證資訊匯出為未加密狀態:
docker exec -u node -it <your-n8n-container> n8n export:credentials --id=fMLJ7Uoza0CFhRy3 --decrypted --output=/home/node/.n8n/ssh.json
這會放在你掛載的 n8n 卷宗中,你可以從主機編輯它。將完整的 OpenSSH 金鑰放入 privateKey 作為單一 JSON 字串,每行換行處用 \n,然後用相同的 ID 匯入回去:
docker exec -u node -it <your-n8n-container> n8n import:credentials --input=/home/node/.n8n/ssh.json
重新啟動容器,然後刪除 ssh.json,它以純文字方式保存金鑰。