SSH не может прочитать ключ из пользовательского файла authorized_keys из-за запятой

SSH не может прочитать ключ из пользовательского файла authorized_keys из-за запятой

Мне достался некоторый код; среди прочего, есть специальный authorized_keysфайл с ключами X.509 в таком формате:

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

Процесс таков, что SSH считывает из пользовательского /mydir/authorized_keysфайла, если /.ssh/authorized_keysфайл не предоставляет правильный ключ. Все шло нормально, за исключением того, что был изменен один ключ, и запятая ( ,) должна была быть добавлена ​​к одному значению ключа.

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

Через некоторое время я попытался немного разобраться, можно ли что-то с этим сделать. Просматривая патч и страницу руководства, я обнаружил несколько упоминаний:

[...] строка должна содержать сертификат X.509 в кодировке base64 (старый стиль) или ключевое слово (новый стиль), за которым может следовать символ '=' (равно) или ':' (двоеточие), ноль или более пробелов и сертификат X.509 ``Distinguished Name'' (Subject). Ключевое слово нечувствительно к регистру и может быть одним из 'Subject' , 'Distinguished Name' , 'Distinguished-Name' , 'Distinguished_Name' , 'DistinguishedName' или 'DN'. Разделителем элементов Subject может быть '/' (косая черта), ',' (запятая) или смешанный порядок, порядок не важен.

Мы можем заметить, что мы также можем разделять пары «ключ-значение» с помощью косой черты, что может облегчить работу парсера:

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);
+}

Так что если это все еще беспокоит вас, вам, вероятно, придется исправить код и/или написать автору этого кода, чтобы он исправил это (вероятно, наэтот список рассылки).

Связанный контент