클라이언트 컴퓨터에서 공개/개인 키 쌍을 생성했습니다. 호스트 파일에 공개 키를 추가하면 이제 비밀번호를 입력하지 않고도 SSH를 성공적으로 수행할 수 있습니다 ~/.ssh
.id_rsa
id_rsa.pub
authorized_keys
이제 공개 키를 해당 폴더 밖으로 이동 mv ~/.ssh/id_rsa.pub ~/
하고 호스트에 다시 SSH를 시도했습니다. 실패할 것으로 예상했지만(공개 키가 누락되었기 때문에) 여전히 작동합니다! 어떻게요? 디렉토리에 없는 경우 공개 키를 어떻게 찾나요 ~/.ssh
? 홈 폴더 외부의 다른 위치로 이동해 보았지만 비밀번호 확인이 성공하지 못한 채 계속 연결됩니다.
답변1
ssh-agent에 의해 키가 캐시되지 않았는지 확인하세요.
캐시된 키 목록을 가져옵니다.
ssh-add -l
캐시된 키를 모두 삭제합니다.
ssh-add -D
답변2
공개 키 암호화를 사용하면 공개 키를 제공하고 개인 키는 비공개로 유지합니다. 누군가 당신에게 무언가를 보내려고 할 때, 그들은 자신의 공개 키를 사용하여 그것을 암호화하고 당신은 개인 키를 사용하여 그것을 해독합니다. 공개 키를 제공하면 메시지를 해독하는 데 공개 키가 필요하지 않습니다.
ssh가 이러한 키를 사용하는 방법에 대한 자세한 내용은 모르지만 해당 -v
옵션을 사용하면 다음과 같은 내용이 표시됩니다.
$ ssh -vvv vm
...
debug1: identity file /Users/username/.ssh/id_rsa type 0
...
debug1: Offering public key: /Users/username/.ssh/id_rsa RSA SHA256:...
debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 60
debug1: Server accepts key: /Users/username/.ssh/id_rsa RSA SHA256:/...
이를 고려하면 개인 키를 사용하여 공개 키를 얻은 다음 공개 키를 원격 호스트로 보내는 것 같습니다.
이 구성이 더 이상 유효하지 않게 하려면 개인 키( ~/.ssh/id_rsa
)를 [제거]해야 합니다.
답변3
리모컨에 아직 공개 키( ~/.ssh/authorized_keys
)가 있다고 말씀하셨습니다. 그리고 로컬에도 개인키( ~/.ssh/id_rsa
)가 있습니다.
그게 다야.
예(다른 답변에 대한 설명) 프로토콜은 들어갈 때까지 사용 가능한 모든 키를 시도합니다.
해시를 보내는 것은 키를 더 빨리 찾는 방법일 뿐입니다. 리모컨은 모든 공개 키를 해시하고 해시를 비교한 후 일치하는 키를 사용합니다. 공개 키는 개인 키(파일)에서 파생될 수 있습니다.
debug1: Offering public key: /Users/username/.ssh/id_rsa RSA SHA256
클라이언트가 개인 키 파일에서 공개 키 해시를 파생하고 있음을 나타냅니다. 따라서 공개 키가 있거나 공개 키가 개인 키에서 파생될 수 있습니다(키 유형에 따라 다름).
답변4
(공개 키가 분실되었기 때문에) 실패할 것으로 예상하고 다시 SSH를 통해 호스트에 연결을 시도했지만 여전히 작동했습니다! 어떻게요?
공개 키를 원격 서버에 보내고 나면(그리고 원격 서버가 해당 authorized_keys
파일에 공개 키를 저장한 경우) 더 이상 공개 키 파일이 필요하지 않습니다. 인증에 필요한 것은 개인 키뿐입니다.
물론 공개 키 파일을 보관하는 것이 좋습니다. 하지만RSA 개인 키에는 공개 키가 포함되어 있기 때문에을 사용하면 언제든지 개인 키 파일에서 공개 키 파일을 추출할 수 있습니다.
특히 RSA 개인 키의 내용은 다음과 같습니다.
-----BEGIN RSA PRIVATE KEY-----
RSAPrivateKey ::= SEQUENCE {
version Version,
modulus INTEGER, -- n
publicExponent INTEGER, -- e
privateExponent INTEGER, -- d
prime1 INTEGER, -- p
prime2 INTEGER, -- q
exponent1 INTEGER, -- d mod (p-1)
exponent2 INTEGER, -- d mod (q-1)
coefficient INTEGER, -- (inverse of q) mod p
otherPrimeInfos OtherPrimeInfos OPTIONAL
}
-----END RSA PRIVATE KEY-----
RSA 공개 키의 내용은 다음과 같습니다.
-----BEGIN RSA PUBLIC KEY-----
RSAPublicKey ::= SEQUENCE {
modulus INTEGER, -- n
publicExponent INTEGER -- e
}
-----END RSA PUBLIC KEY-----