SSH 키 지문을 구하는 방법
- 공개 키 줄을 하나 이상 SSH 키에 붙여넣거나
.pub,authorized_keys,known_hosts파일을 놓으세요. - 키마다 카드가 생기며 유형, 크기 또는 곡선, 주석, SHA256과 MD5 지문, 정확한
ssh-keygen -l줄이 표시됩니다. - 출력 창에 무엇을 담을지 고르세요. SHA256 지문, MD5 지문, PEM 공개 키(SPKI 또는 PKCS#1), RFC 4716, 정규화된 OpenSSH 줄 중 하나입니다.
- 결과를 출력 복사하거나 다운로드하세요. 카드의 지문 복사는 그 값 하나만 복사합니다.
일반 .pub 줄 외에도 받아들이는 입력이 많습니다. from="10.0.0.0/8",command="…" 같은 authorized_keys 옵션, 호스트 이름이나 해시된 |1|… 항목이 있는 known_hosts 줄, RFC 4716 ---- BEGIN SSH2 PUBLIC KEY ---- 블록, OpenSSH 인증서, PEM 공개 키, -----BEGIN OPENSSH PRIVATE KEY----- 파일이 모두 됩니다.
지문을 계산하는 방식
OpenSSH 공개 키 줄은 유형, Base64 키 blob, 주석의 세 부분으로 이루어집니다.
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG4ZlfvPsoxxd6tpkc1MDAJvZf8exJSDeW7a3xQRKA7d alice@laptop
지문은 디코딩한 blob의 해시이며, Ed25519에서는 51바이트입니다.
| 형식 | 위 키의 값 |
|---|---|
| SHA256 (OpenSSH 6.8+ 기본값) | SHA256:XSOBs9uz/dFf9ci88yKGbLMcjtzblRna8F0VOmxZiv8 |
| MD5 (레거시) | MD5:93:07:89:27:05:e1:7a:5d:92:6e:ab:13:1e:48:90:d5 |
SHA256 지문은 끝의 =를 뺀 Base64로 쓰므로 접두사 뒤가 항상 43자입니다. Python으로 같은 계산을 하면 다음과 같습니다.
import base64, hashlib, sys
line = open(sys.argv[1]).read().split()
blob = base64.b64decode(line[1])
digest = hashlib.sha256(blob).digest()
print("SHA256:" + base64.b64encode(digest).decode().rstrip("="))
=를 빼도 되는 이유는 패딩 설명을, 더 많은 내용은 Python에서 Base64를 참고하세요.
신뢰하기 전에 호스트 키 확인하기
처음 접속하면 OpenSSH가 ED25519 key fingerprint is SHA256:…. Are you sure you want to continue connecting?라고 묻습니다. 올바른 답은 그 값을 다른 경로로 얻은 값과 비교해야 알 수 있습니다.
- 서버 콘솔에서:
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub - 호스팅 업체가 게시한 호스트 키 지문에서
- 이미
known_hosts에 그 호스트가 있는 동료에게서: 그 파일을 여기에 붙여넣으면 모든 항목이 지문과 함께 나열됩니다
로그인하지 않고 서버가 제공하는 키를 보려면 ssh-keyscan host.example.com | ssh-keygen -lf -가 모든 호스트 키 지문을 출력합니다.
Base64로 키 유형 알아보기
blob은 길이가 앞에 붙은 문자열 형태의 키 유형으로 시작하므로, 유형마다 Base64의 시작 부분이 고정되어 있습니다.
| 시작 부분 | 키 유형 |
|---|---|
AAAAC3NzaC1lZDI1NTE5 | ssh-ed25519 |
AAAAB3NzaC1yc2E | ssh-rsa |
AAAAE2VjZHNhLXNoYTItbmlzdHAyNT | ecdsa-sha2-nistp256 |
AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29t | sk-ssh-ed25519@openssh.com (FIDO 보안 키) |
AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAx | Ed25519 인증서 |
줄에 적힌 유형과 blob이 다르면 카드가 불일치를 경고합니다. 대개 누군가 줄을 손으로 고쳤다는 뜻입니다.
경고와 제한
- 2048비트 미만 RSA는 취약하다고 표시되고, DSA 키는 최신 OpenSSH에서 비활성화되어 있으므로 표시됩니다.
- 인증서(
*-cert-v01@openssh.com)는 키 ID, 일련번호, 사용자 또는 호스트 유형, 프린시펄, 유효 기간, 중요 옵션, 확장, 서명한 CA 키의 지문을 보여 줍니다. - FIDO 키(
sk-…)와 Ed448은 디코딩되지만 PEM 변환은 지원하지 않습니다. - 개인 키 파일 안에 저장된 주석은 표시하지 않습니다.
- SHA256은 브라우저의 WebCrypto API를 쓰므로 https 페이지가 필요합니다. MD5는 페이지가 직접 계산합니다.
자주 묻는 질문
내 SSH 키의 지문은 어떻게 확인하나요?
위에 .pub 파일 내용을 붙여넣거나 ssh-keygen -lf ~/.ssh/id_ed25519.pub을 실행하세요. 둘 다 256 SHA256:XSOBs9uz… alice@laptop (ED25519) 같은 줄을 출력합니다.
다른 서버나 서비스에서는 지문이 다르게 보이는 이유는 무엇인가요?
대개 해시 방식 차이입니다. 오래된 도구와 일부 웹 콘솔은 콜론으로 구분한 hex의 MD5(MD5:93:07:89:…)를 보여 주고, 최신 OpenSSH는 Base64의 SHA256을 보여 줍니다. 예전 형식과 비교하려면 출력을 MD5 지문으로 바꾸세요.
개인 키 파일을 여기에 붙여넣어도 안전한가요?
도구는 OPENSSH PRIVATE KEY 파일의 공개 부분만 읽습니다. 이 부분은 비밀번호로 보호된 키에서도 암호화되지 않은 채 저장되며, 개인 부분은 건드리지 않습니다. 그래도 .pub 파일을 붙여넣는 습관이 더 좋습니다.
SHA256 지문은 정확히 무엇을 해시하나요?
바이너리 키 blob, 즉 .pub 줄의 Base64 부분을 디코딩한 것입니다. 주석과 앞쪽의 키 유형 텍스트는 포함되지 않으므로, 키 이름을 바꿔도 지문은 그대로입니다.