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가 사용자 정의 파일에서 읽는 프로세스입니다 . /.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 인증서(이전 스타일) 또는 키워드(새 스타일)가 포함되어야 하며, 선택적으로 기호 '='(같음) 또는 ':'(콜론), 0개 이상의 공백 및 X가 와야 합니다. .509 인증서 ``고유 이름''(제목). 키워드는 대소문자를 구분하지 않으며 'Subject' , 'Distinguished Name' , 'Distinguished-Name' , 'Distinguished_Name' , 'DistinguishedName' 또는 'DN' 중 하나일 수 있습니다. 제목 항목의 구분 기호는 '/'(슬래시), ','(쉼표) 또는 혼합일 수 있으며 순서는 중요하지 않습니다.

키-값을 슬래시로 구분하여 파서를 더 행복하게 만들 수 있다는 것을 알 수 있습니다.

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);
+}

따라서 이것이 여전히 걱정된다면 코드를 패치하거나 이 코드 작성자에게 편지를 보내 문제를 해결해야 할 것입니다(아마도이 메일링 리스트).

관련 정보