
我繼承了一些程式碼;除此之外,還有一個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);
+}
因此,如果您仍然擔心這個問題,您可能需要修補程式碼和/或寫信給此程式碼的作者來解決這個問題(可能在這個郵件列表)。