SSH 서버 키 지문 가져 오기


82

SSH 서버 키 지문 을 프로그래밍 하지 않고 프로그래밍 방식으로 얻을 수 있는 방법 이 있습니까?

시도 ssh -v user@host false 2>&1 | grep "Server host key"하고 있지만 키 기반 인증이 설정되어 있지 않으면 암호를 기다리는 중입니다.

답변:


71

당신은 결합하여이 작업을 수행 할 수 ssh-keyscanssh-keygen:

$ file=$(mktemp)
$ ssh-keyscan host > $file 2> /dev/null
$ ssh-keygen -l -f $file
521 de:ad:be:ef:de:ad:be:ef:de:ad:be:ef:de:ad:be:ef host (ECDSA)
4096 8b:ad:f0:0d:8b:ad:f0:0d:8b:ad:f0:0d:8b:ad:f0:0d host (RSA)
$ rm $file

(불행히도 훨씬 간단 ssh-keyscan host | ssh-keygen -l -f /dev/stdin하지 않습니다)


1
어쩌면 ssh-keygen -l -f - <(ssh-keyscan host)하지만합니까?
CVn

21
OpenSSH> = 7.2 ssh-keyscan은 stdin에서 읽을 수 있습니다 :ssh-keyscan host | ssh-keygen -lf -
mykhal

1
그냥 할 :ssh-keygen -l -f <(ssh-keyscan host)
크리스토퍼

1
POSIX 쉘이 지원하지 않는 쉘에 의존하기 때문에 쉘 스크립트에는 다소 나쁜 표현입니다.
Andreas Wiese

2
ssh-keygen -l -f -ssh-keygen 7.2 이상에서 예상대로 작동합니다. 그것은 안토니 문헌 [Geoghegan 나에 의해이 질문에 대해 언급 한 바와 같이, 필터링 할 수 STDERR 일부 주석 행을 생산ssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
세드릭 나이트

56

최근 에이 작업을 직접 수행해야했기 때문에 프로세스 대체를 사용하여 한 줄 로이 작업을 수행하는 방법 ( OpenSSH 7.2 이상 버전 ) 을 보여주는 답변을 추가 할 것이라고 생각했습니다 .

ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)

다음 텍스트는 이러한 명령의 작동 방식을 설명하고 이전 버전과 최신 버전의 OpenSSH 유틸리티 간의 동작 차이를 보여줍니다.

공개 호스트 키 가져 오기

ssh-keyscan명령은 사용자가 SSH 서버에 대한 인증없이 공개 호스트 키를 얻을 수 있도록 개발되었습니다. 매뉴얼 페이지에서 :

ssh-keyscan여러 호스트의 공개 ssh 호스트 키를 수집하기위한 유틸리티입니다. ssh_known_hosts파일을 작성 하고 확인하는 데 도움이되도록 설계되었습니다 .

키 타입

가져올 키 유형은 -t옵션을 사용하여 지정합니다 .

  • rsa1 (구식의 SSH 프로토콜 버전 1)
  • rsa
  • dsa
  • ecdsa (최신 버전의 OpenSSH)
  • ed25519 (최신 버전의 OpenSSH)

최신 OpenSSH 릴리스에서 가져올 기본 키 유형은 rsa (버전 5.1 이후), ecdsa(버전 6.0 이후) 및 ed25519(버전 6.7 이후)입니다.

으로 이전 버전ssh-keyscan(OpenSSH를 버전 5.1 이전)의 기본 키 유형은 아웃 일자이었다 rsa1명시 적으로 지정 될 필요가있다 (SSH 프로토콜 1) 그래서 키 유형 :

ssh-keyscan -t rsa,dsa hostname

Base64 키의 지문 해시 가져 오기

ssh-keyscanSSH 서버의 호스트 키를 Base64 인코딩 형식으로 인쇄 합니다. 이것을 지문 해시로 변환하기 위해 ssh-keygen유틸리티를 -l옵션 과 함께 사용 하여 지정된 공개 키의 지문을 인쇄 할 수 있습니다 .

Bash, Zsh (또는 Korn 쉘)를 사용하는 경우 편리한 단일 라이너를 위해 프로세스 대체를 사용할 수 있습니다.

ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)

참고 : 7.2 이전의 OpenSSH 버전에서 ssh-keygen파일을 읽는 데 사용되는 함수 는 FIFO (명명 된 파이프)를 잘 처리하지 않으므로이 방법이 작동하지 않으므로 임시 파일을 사용해야합니다.

해싱 알고리즘

최신 버전의 ssh-keygen인쇄 SHA256 지문 해시 키 서버 키 지문의 MD5 해시 (이전 동작) 를 얻으려면이 -E 옵션을 사용하여 해시 알고리즘을 지정할 수 있습니다.

ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null)

파이프 라인 사용

dash프로세스 대체 기능이없는 POSIX 쉘 (예 :)을 사용하는 경우 임시 파일을 사용하는 다른 솔루션이 작동합니다. 단, (7.2) 이후 OpenSSH의 새 버전의 단순한 파이프 라인은 이후 사용될 수있는 ssh-keygen허용 할 -한 줄의 파이프 라인 명령을 허용하는 표준 입력 스트림의 파일명으로.

ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf -

훌륭하고 철저한 대답, 이것은 임시 파일을 갖는 것보다 확실히 낫습니다! 초조 한 사람들이 더 빨리 찾을 수 있도록 프로세스 대체 버전으로 TL; DR을 제공하는 것이 좋습니다. :)
goncalopp

3
Ubuntu 14.04 LTS에서는 작동하지 않는 것 같습니다. "/ dev / fd / 63은 공개 키 파일이 아닙니다"라는 오류가 발생합니다. 하위 프로세스가 작동합니다.
Melle

@melleb 나는 내가 액세스 할 수있는 12.04 시스템에서 같은 것을 발견했다. 나는 의심 ssh-keygenOpenSSH를 이전 버전에서 FIFO / 명명 된 파이프에서 읽는 데 문제가 있습니다. 자유 시간이 생기면 이것을 조사하고 답변을 업데이트하겠습니다.
Anthony Geoghegan

3
@melleb 다양한 소스 코드 릴리스를 다운로드 printf하고 do_fingerprint()함수에 디버깅 문을 삽입하는 luch-time을 보낸 후 7.2 이전의 OpenSSH 버전에서는 ssh-keygen파일을 읽는 데 사용되는 함수가 명명 된 파이프 (FIFO)를 잘 처리하지 못했음을 알았습니다. 프로세스 대체 방법이 작동하지 않습니다.
Anthony Geoghegan

이것은 작동하지만 지문을 확인하기 위해 사용하는 경우 경쟁 조건이 있음을 알아야합니다.이 명령으로 확인하는 지문은 ssh- 그것에 keygen.
CodeGnome

20

nmapssh-hostkey스크립트 를 사용하여이 기능을 제공합니다 .

키의 16 진수 지문을 반환하려면

$ nmap [SERVER] --script ssh-hostkey

키의 내용을 반환하려면

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=full

키의 시각적 거품을 반환하려면

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey='visual bubble'

위의 모든 것을 반환하려면 :

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=all

출처 : nmap 문서


3
이 예제는 SSH가 항상 포트 22에서 실행되고 있다고 가정합니까? ssh가 비표준 포트를 수신하면 어떻게됩니까?
Martin Vegter

3
@MartinVegter (구술 할 수없는 Guarin42를 설명 할 수없는) : nmap에는 -p포트를 지정할 수 있는 옵션이 있습니다 (예 :) -p 22000. -vv자세한 정보를 제공하기
위해이

2

filezilla는 md5로 해시 된 키를 16 진수 형식으로 표시 합니다.

우분투 리눅스 머신 에서 이것을 찾으 려면 다음 명령을 사용하십시오 :

ssh-keygen -l -E md5 -f <(ssh-keyscan localhost 2>/dev/null)

참고 : "localhost"를 확인하려는 시스템의 IP로 바꾸십시오.


1

다음은 쉘 스크립트입니다 (주로 Bourne 쉘이지만 local키워드를 사용하여 가장 현대적으로 사용 가능 /bin/sh합니다). 처럼 사용하십시오 ssh-hostkey hostname. 지정된 호스트 이름 또는 IP 주소의 모든 호스트 키에 대한 sha256 및 md5 형식 지문을 모두 표시합니다. 특정 형식 만 표시하기 위해 " md5"또는 " sha256"를 두 번째 인수로 수동으로 지정할 수도 있습니다 .

파이핑 대신 임시 파일을 사용하여 다른 답변에 설명 된대로 이전 OpenSSH 패키지와 호환되도록합니다. 사용 /dev/shm가능한 경우 임시 파일은 (공유 메모리)를 사용합니다.

#!/bin/sh
usage () {
  printf '%s\n' "Usage: ssh-hostkey HOSTNAME [FPRINTHASH]"
}

ssh_hostkey () {
  local host="$1"
  local fprinthash="$2"
  local tmp=

  case "$host" in
    -h|--help|'')
      usage >&2
      return 1
      ;;
  esac

  case "$fprinthash" in
    md5|sha256|'') true;;
    *)
      usage >&2
      printf '%s\n' "Fingerprint hash may be 'md5' or 'sha256'" >&2
      return 2
      ;;
  esac

  if test -d /dev/shm
  then tmp="$(mktemp -d -p /dev/shm)"
  else tmp="$(mktemp -d)"
  fi

  trap 'trap - INT TERM EXIT; rm -rf "$tmp"' INT TERM EXIT
  ssh-keyscan "$host" > "$tmp/f" 2> /dev/null
  case "$fprinthash" in
    sha256|'') ssh-keygen -l -f "$tmp/f" 2> /dev/null;;
  esac
  case "$fprinthash" in
    md5|'') ssh-keygen -l -E md5 -f "$tmp/f" 2> /dev/null;;
  esac

  trap - INT TERM EXIT
  rm -rf "$tmp" > /dev/null 2>&1
}

ssh_hostkey "$@"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.