[unix] SSH 서버 키 지문 가져 오기

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

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



답변

당신은 결합하여이 작업을 수행 할 수 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하지 않습니다)


답변

최근 에이 작업을 직접 수행해야했기 때문에 프로세스 대체를 사용하여 한 줄 로이 작업을 수행하는 방법 ( 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 -


답변

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 문서


답변

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

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

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

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


답변

다음은 쉘 스크립트입니다 (주로 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 "$@"


답변