SSH не может прочитать ключ из пользовательского файла author_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 ответ
Через некоторое время я попытался немного покопаться, чтобы увидеть, могу ли я что-то с этим сделать. Просматривая патч и страницу руководства, можно упомянуть несколько вещей:
Строка [...] должна содержать зашифрованный в 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);
+}
Поэтому, если это все еще вызывает у вас беспокойство, вам, вероятно, потребуется исправить код и / или написать автору этого кода, чтобы исправить это (возможно, в этом списке рассылки).