由于逗号,SSH 无法从自定义 authorized_keys 文件中读取密钥

由于逗号,SSH 无法从自定义 authorized_keys 文件中读取密钥

我继承了一些代码;除其他外,还有一个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 证书“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);
+}

因此,如果您仍然担心这个问题,您可能需要修补代码和/或写信给代码的作者来修复它(可能在此邮件列表)。

相关内容