5

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

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

Процесс таков, что SSH читает из файла custom /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 ответ1

0

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

Строка [...] должна содержать зашифрованный в Base64 сертификат X.509 (старый стиль) или ключевое слово (новый стиль), за которым необязательно следует символ '=' (равно) или ':' (двоеточие), ноль или более пробелов и X .509 сертификат `` Отличительное имя '' (Тема). Ключевое слово нечувствительно к регистру и может быть одним из следующих:«Тема», «Отличительное имя», «Отличительное имя», «Отличительное имя», «Отличительное имя» или «DN». Разделитель Предметов может быть '/' (косая черта), ',' (запятая) или смешанным, и порядок не важен.

Мы можем заметить, что мы можем разделить значения ключа также косой чертой, что может сделать анализатор более счастливым:

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

Но, к сожалению, нет. Парсер выглядит очень "фиктивно", анализирует оба разделителя независимо от контекста и не поддерживает никаких escape-последовательностей:

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .