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

524
dzookatz

Я унаследовал некоторый код; среди прочего, существует специальный 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на коробке и прочитал руководство. В нем говорится, что косая черта также может использоваться для разделения, но она используется в сочетании с запятой, поэтому не стоит идти туда.

Примечание: ключ не может быть изменен.

5
Здесь просто дикая догадка, но [эта страница] (https://en.wikibooks.org/wiki/OpenSSH/Client_Configuration_Files#.7E.2F.ssh.2Fauthorized_keys) предполагает, что пробелы в полях авторизованных ключей используются для разделения опций. Вы пытались избавиться от места в «GrandsChocolatiers, Ltd.» или избежать его? amccormack 8 лет назад 0
Хорошая догадка :) Но, вот как ключи, и они не могут быть изменены. Это не место, которое вызывает проблему, это запятая. Читая руководство authorization_keys, говорится: `Разделитель предметов может быть '/' (косая черта), ',' (запятая) или смешанным, и порядок не важен. 8 лет назад 0
если я правильно понял, это openssh с [патчем x509] (http://roumenpetrov.info/openssh/), который переносит это расширение в авторизованные ключи. Похоже, логика нарушена, если вы можете разбить ее запятой в значении `subject`. Если помещение значения в кавычки не помогает, возможно, это содержание отчета об ошибке для автора этого патча. Jakuje 8 лет назад 1
Если порядок не важен, что если вы попытались использовать: `subject: OU = Top, OU = Management, O = GrandsChocolatiers, Ltd.`? Castaglia 8 лет назад 0
Отмена заказа не решит тот факт, что он просто обрежет часть между двумя запятыми :) Он по-прежнему будет распознаваться как особый элемент - `Ltd.`. dzookatz 8 лет назад 0

1 ответ на вопрос

0
Jakuje

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

Строка [...] должна содержать зашифрованный в 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); +} 

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

Похожие вопросы