由於逗號,SSH 無法從自訂authorized_keys 檔案中讀取金鑰

由於逗號,SSH 無法從自訂authorized_keys 檔案中讀取金鑰

我繼承了一些程式碼;除此之外,還有一個authorized_keys帶有 X.509 密鑰的自訂文件,其格式如下:

x509v3-sign-rsa subject:O=GrandsChocolatiers Ltd.,OU=Management,OU=Top

/mydir/authorized_keys該過程是這樣的,如果自訂/.ssh/authorized_keys檔案未提供正確的金鑰,則 SSH 會讀取該檔案。一切都很順利,只是一個鍵發生了變化,並且,必須在一個鍵值中添加一個逗號 ( )。

subject:O=GrandsChocolatiers, Ltd.,OU=Management,OU=Top

現在,我收到 sshd 錯誤

error: x509key_str2X509NAME: cannot parse 'Ltd.'

error: key_read: uudecode subject:O=GrandsChocolatiers, Ltd.,...

我嘗試在密鑰檔案中使用 來轉義這一點\,\\,將字串放在單引號和雙引號中,但錯誤仍然存在,儘管錯誤文字隨插入的符號而變化。

SSH 在讀取金鑰時有什麼辦法可以轉義逗號嗎?有沒有辦法放置不同格式的金鑰?

man authorized_keys在盒子上做了一個檢查並閱讀了手冊。它說斜槓也可以用來分隔,但是,它與逗號結合使用,所以不去那裡。

注意:密鑰不能更改。

答案1

一段時間後,我嘗試深入挖掘,看看是否有什麼我可以做的。瀏覽補丁和手冊頁,提到了幾件事:

[...] 行必須包含base64 編碼的X.509 憑證(舊樣式)或關鍵字(新樣式),可選擇地後接符號「=」(等於)或「:」(冒號)、零個或多個空格和 X .509 憑證“專有名稱”(主題)。關鍵字不區分大小寫,可以是 'Subject' 、 'Distinguished Name' 、 'Distinguished-Name' 、 'Distinguished_Name' 、 'DistinguishedName' 或 'DN' 之一。主題項的分隔符號可以是「/」(斜線)、「,」(逗號)或混合,順序並不重要。

我們可以觀察到我們也可以用斜線分隔鍵值,這可以讓解析器更滿意:

subject:O=GrandsChocolatiers, Ltd./OU=Management/OU=Top

但不幸的是沒有。解析器看起來非常“虛擬”,無論上下文如何解析兩個分隔符,並且不支援任何轉義序列:

+static const char*
+x509key_find_subject(const char* s) {
+   static const char *keywords[] = {
+       "subject",
+       "distinguished name",
+       "distinguished-name",
+       "distinguished_name",
+       "distinguishedname",
+       "dn",
+       NULL
+   };
+   const char **q, *p;
+   size_t len;
+
+   if (s == NULL) {
+       error("x509key_find_subject: no input data");
+       return(NULL);
+   }
+   for (; *s && ISSPACE(*s); s++)
+   {/*skip space*/}
+
+   for (q=keywords; *q; q++) {
+       len = strlen(*q);
+       if (strncasecmp(s, *q, len) != 0) continue;
+
+       for (p = s + len; *p && ISSPACE(*p); p++)
+       {/*skip space*/}
+       if (!*p) {
+           error("x509key_find_subject: no data after keyword");
+           return(NULL);
+       }
+       if (*p == ':' || *p == '=') {
+           for (p++; *p && ISSPACE(*p); p++)
+           {/*skip space*/}
+           if (!*p) {
+               error("x509key_find_subject: no data after separator");
+               return(NULL);
+           }
+       }
+       if (*p == '/' || *p == ',') {
+           /*skip leading [Relative]DistinguishedName elements separator*/
+           for (p++; *p && ISSPACE(*p); p++)
+           {/*skip space*/}
+           if (!*p) {
+               error("x509key_find_subject: no data");
+               return(NULL);
+           }
+       }
+       return(p);
+   }
+   return(NULL);
+}

因此,如果您仍然擔心這個問題,您可能需要修補程式碼和/或寫信給此程式碼的作者來解決這個問題(可能在這個郵件列表)。

相關內容