我继承了一些代码;除其他外,还有一个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);
+}
因此,如果您仍然担心这个问题,您可能需要修补代码和/或写信给代码的作者来修复它(可能在此邮件列表)。