긴 이야기 짧게

긴 이야기 짧게

질문매우 간단합니다:

(개인 키)란 무엇입니까?유형그리고 (그들의사양- 현재 허용되는 형식, 구문)SSH 열기?

"다음에 의해 생성된 키"에 대한 모호한 답변 ssh-keygen은 허용되지 않습니다. 저도 알고 있습니다. 이를 PEM이라고 하며 다음과 같은 헤더(RSA, DSA, ECDSA 변형)가 있습니다.

-----BEGIN RSA PRIVATE KEY-----

다른 형식은 다음에 설명되어 있습니다.프로토콜 키그리고 확장하여 openssh. 또한 Ed25519설명서에 설명된 대로 키의 기본값 으로 사용되며 제목(암호와 관계없이)이 표시됩니다.

-----BEGIN OPENSSH PRIVATE KEY-----

RSA1이제 SSHv1 프로토콜과 함께 사라져야 하는 일부 레거시 키도 있지만 헤더로 식별할 수 있습니다.

SSH PRIVATE KEY FILE FORMAT 1.1

다른 사람이 있나요? 다른 키에 대한 자세한 설명을 찾고 있습니다. 매뉴얼 페이지나 SSH용 RFC에서 (지금까지) 명시적으로 지정된 것을 찾지 못했습니다.

이것보너스 질문(답변은 필요하지 않지만 귀하의 통찰력에 감사드립니다):

openssh()는 모든 더미 파일을 디코딩하고 올바른 헤더가 없더라도 비밀번호를 요청합니다. 그 이유는 무엇입니까?


각주:원래 게시된 질문openssh-unix-dev 목록, 하지만 아직까지 답변이 없으므로 누구든지 답변하실 수 있으면 이 멋진 커뮤니티를 시도해 보려고 합니다.

답변1

긴 이야기 짧게

@forcefsck의 가장 유용한 의견입니다. 불행히도 그는 답변을 작성하지 않았기 때문에 현상금을 수여할 수 없습니다. 간단히 말해서 대답은 다음과 같습니다.양성자 교환막+RSA1+ 질문에 설명된 새로운 openSSH 형식의 주요 문제점은 PEM입니다.

긴 형식 및 보너스

OpenSSH는 모든 실패( )에 대해 고유한 반환 값을 갖는 openSSL( PEM_read_bio_PrivateKey()) 파서를 사용하며 NULL, 실패할 경우 openSSH는 잘못된 비밀번호 때문이라고 생각합니다.

OpenSSL 없음

방금 OpenSSL 지원(구성 옵션) 없이 OpenSSH 구축을 시도했는데 --without-openssl동작이 "올바릅니다".

# ./ssh-add <(echo "")
Error loading key "/dev/fd/63": invalid format

OpenSSL을 사용하여 수정

또 다른 것은 그것을 해결하는 방법입니다. poke는 ERR_get_error()함수와 그 친구들 에서 나오며 , 이를 통해 다양한 오류를 구별할 수 있습니다.

비밀번호 오류 오류

# ./ssh-add /tmp/rsa
140480353842840:error:0906A068:lib(9):func(106):reason(104):pem_lib.c:457:
Enter passphrase for /tmp/rsa: 
140480353842840:error:06065064:lib(6):func(101):reason(100):evp_enc.c:592:
140480353842840:error:0906A065:lib(9):func(106):reason(101):pem_lib.c:482:

이유: PEM_R_BAD_PASSWORD_READ, PEM_R_BAD_BASE64_DECODE, PEM_R_BAD_DECRYPT.

구문 분석 오류 코드

# ./ssh-add <(echo "")
139656018548376:error:0906D06C:lib(9):func(109):reason(108):pem_lib.c:701:Expecting: ANY PRIVATE KEY

아니면 이거:

140654301202072:error:0906D066:lib(9):func(109):reason(102):pem_lib.c:809:

이유: PEM_R_NO_START_LINE,, PEM_R_BAD_END_LINE그러나 더 많은 가능성이 있을 수 있습니다.

해결책?

더 많은 OpenSSL 오류 검사를 추가하면 "형식" 오류로 표시할 오류와 "잘못된 비밀번호"로 표시할 오류를 선택할 수 있습니다. 위치는 3800 근처의 형상선에 있습니다 sshkey_parse_private_pem_fileblob().sshkey.c

unsigned long e = ERR_get_error();
if (ERR_GET_REASON(e) == PEM_R_NO_START_LINE ||
    ERR_GET_REASON(e) == PEM_R_BAD_END_LINE) {
        r = SSH_ERR_INVALID_FORMAT;
} else {
        r = SSH_ERR_KEY_WRONG_PASSPHRASE;
}

관련 정보