
Herdei algum código; entre outras coisas, existe um authorized_keys
arquivo personalizado com chaves X.509 em um formato como este:
x509v3-sign-rsa subject:O=GrandsChocolatiers Ltd.,OU=Management,OU=Top
O processo é tal que o SSH lê o /mydir/authorized_keys
arquivo customizado, se o /.ssh/authorized_keys
arquivo não fornecer a chave correta. Tudo estava indo bem, exceto que houve uma alteração em uma chave e uma vírgula ( ,
) teve que ser adicionada a um valor de chave.
subject:O=GrandsChocolatiers, Ltd.,OU=Management,OU=Top
Agora, recebo um erro sshd
error: x509key_str2X509NAME: cannot parse 'Ltd.'
error: key_read: uudecode subject:O=GrandsChocolatiers, Ltd.,...
Tentei escapar disso no arquivo de chaves usando \,
, \\,
colocando a string entre aspas simples e duplas, mas o erro ainda está lá, embora o texto do erro mude com o símbolo inserido.
Existe alguma maneira do SSH escapar da vírgula ao ler as chaves? Existe uma maneira de colocar um formato diferente da chave?
Dei uma olhada man authorized_keys
na caixa e li o manual. Diz que uma barra também pode ser usada para separar, mas é usada em combinação com uma vírgula, então não vá por aí.
Nota: A chave não pode ser alterada.
Responder1
Depois de algum tempo, tentei me aprofundar um pouco para ver se há algo que eu possa fazer a respeito. Navegando pelo patch e pela página de manual, há várias coisas mencionadas:
[...] linha deve conter certificado X.509 codificado em base64 (estilo antigo) ou uma palavra-chave (novo estilo), opcionalmente seguida pelo símbolo '=' (igual) ou ':' (dois pontos), zero ou mais espaços e X Certificado .509 ``Nome Distinto'' (Assunto). A palavra-chave não diferencia maiúsculas de minúsculas e pode ser 'Subject' , 'Distinguished Name' , 'Distinguished-Name' , 'Distinguished_Name' , 'DistinguishedName' ou 'DN'. O separador de itens de assunto pode ser '/' (barra), ',' (vírgula) ou misto e a ordem não é importante.
Podemos observar que podemos separar os valores-chave também com uma barra, o que pode deixar o analisador mais feliz:
subject:O=GrandsChocolatiers, Ltd./OU=Management/OU=Top
Mas infelizmente não. O analisador parece muito "fictício", analisa ambos os separadores independentemente do contexto e não suporta nenhuma sequência de 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);
+}
Portanto, se ainda for uma preocupação para você, você provavelmente precisará corrigir o código e/ou escrever para o autor deste código para corrigir isso (provavelmente emesta lista de discussão).