SSH no puede leer una clave del archivo personalizado claves_autorizadas debido a una coma

4

Heredé un código; Entre otras cosas, hay un authorized_keysarchivo personalizado con claves X.509 en un formato como este:

x509v3-sign-rsa subject:O=GrandsChocolatiers Ltd.,OU=Management,OU=Top

El proceso es tal que el SSH lee desde el /mydir/authorized_keysarchivo personalizado , si el /.ssh/authorized_keysarchivo no proporciona la clave correcta. Todo iba bien, excepto que hubo un cambio en una clave y se ,tuvo que agregar una coma ( ) a un valor clave.

subject:O=GrandsChocolatiers, Ltd.,OU=Management,OU=Top

Ahora recibo un error sshd

error: x509key_str2X509NAME: cannot parse 'Ltd.'

error: key_read: uudecode subject:O=GrandsChocolatiers, Ltd.,...

He intentado escapar de esto en el archivo de claves usando \,, \\,poniendo la cadena entre comillas simples y dobles, pero el error sigue ahí, aunque el texto del error cambia con el símbolo insertado.

¿Hay alguna forma de que SSH escape de la coma al leer las teclas? ¿Hay alguna manera de poner un formato diferente de la clave?

Hice un man authorized_keyssobre en la caja y leí el manual. Dice que una barra también se puede usar para separar, pero se usa en combinación con una coma, así que no vayas allí.

Nota: La clave no se puede cambiar.

dzookatz
fuente
Solo es una suposición descabellada aquí, pero esta página sugiere que los espacios en blanco en los entrantes autorizado_claves se usan para separar las opciones. ¿Has intentado deshacerte del espacio GrandsChocolatiers, Ltd.o escapar?
amccormack
Una buena suposición :) Pero, así es como son las teclas, y no se pueden cambiar. No es el espacio lo que causa el problema, es la coma. Al leer el manual de autorizaciones_claves, se dice:Separator of Subject items can be ‘/’ (slash), ‘,’ (comma) or mixed and order is not important.
1
si leí bien, esto es openssh con el parche x509 que trae esta extensión a las claves autorizadas. Parece que la lógica está rota, si puede romperla con una coma en el subjectvalor. Si poner el valor entre comillas no ayuda, probablemente sea el contenido del informe de error para el autor de este parche.
Jakuje
Si el orden no es importante, ¿qué pasa si intentaste usar subject:OU=Top,OU=Management,O=GrandsChocolatiers, Ltd.:?
Castaglia
Revertir el pedido no resolverá el hecho de que solo cortará la parte entre las dos comas :) Todavía se reconocerá como un elemento especial: `Ltd.`.
dzookatz

Respuestas:

0

Después de un tiempo, intenté investigar un poco para ver si hay algo que pueda hacer al respecto. Navegando por el parche y la página del manual, hay varias cosas mencionadas:

[...] la línea debe contener certificado X.509 codificado en base64 (estilo antiguo) o una palabra clave (estilo nuevo), opcionalmente seguido por el símbolo '=' (igual) o ':' (dos puntos), cero o más espacios y X .509 certificado `` Nombre distinguido '' (Asunto). La palabra clave no distingue entre mayúsculas y minúsculas y puede ser una de 'Asunto', 'Nombre distinguido', 'Nombre distinguido', 'Nombre_distinguido', 'Nombre distinguido' o 'DN'. El separador de elementos del Asunto puede ser '/' (barra inclinada), ',' (coma) o mixto y el orden no es importante.

Podemos observar que también podemos separar los valores-clave con una barra, lo que puede hacer que el analizador sea más feliz:

subject:O=GrandsChocolatiers, Ltd./OU=Management/OU=Top

Pero desafortunadamente no. El analizador se ve muy "ficticio", analiza ambos separadores independientemente del contexto y no admite ninguna secuencia 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);
+}

Por lo tanto, si todavía le preocupa, es probable que necesite parchear el código y / o escribir al autor de este código para solucionarlo (probablemente en esta lista de correo ).

Jakuje
fuente