인증없이 프로그래밍 방식으로 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는 작동하지 않습니다.)

댓글

  • 어쩌면 ssh-keygen -l -f - <(ssh-keyscan host)가 가능할까요?
  • OpenSSH > = 7.2 ssh-keyscan은 stdin에서 읽을 수 있습니다. ssh-keyscan host | ssh-keygen -lf -
  • 그냥 수행 : ssh-keygen -l -f <(ssh-keyscan host)
  • ssh-keygen -l -f -는 ssh-keygen 7.2 이상에서 예상대로 작동합니다. answ에서 언급했듯이 필터링 할 수있는 STDERR에 주석 줄을 생성합니다. er by Anthony Geoghegan 또는 ssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
  • 새로운 버전의 openssh (최소한 7.2)는 지문을 SHA256 (예 : 2048 SHA256:gYz11pP/v/SMzUD58jrZ+m1EFC1pvyMxvIrg4PYlvDY) 이전 형식을 원할 경우 -E md5를 제공하면 ‘ .

답변

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

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

다음 텍스트는 이러한 명령이 작동하는 방식을 설명하고 OpenSSH 유틸리티의 이전 버전과 새 버전 간의 동작 차이를 강조합니다.

공개 호스트 키 가져 오기

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

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부터)

iv id의 이전 버전 사용 = “959be47752”>

(OpenSSH 버전 5.1 이전), 기본 키 유형은 오래된rsa1(SSH 프로토콜 1)이므로 키 유형을 명시 적으로 지정해야합니다.

ssh-keyscan -t rsa,dsa hostname 

Base64 키의 지문 해시 가져 오기

ssh-keyscan 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) 

파이프 라인 사용

POSIX 셸을 사용하는 경우 (예 : dash) 프로세스 대체 기능이없는 경우 임시 파일을 사용하는 다른 솔루션이 작동합니다. 그러나 최신 버전의 OpenSSH (7.2 이후)에서는 ssh-keygen-를 파일 이름으로 허용하므로 간단한 파이프 라인을 사용할 수 있습니다. 한 줄 파이프 라인 명령을 허용하는 표준 입력 스트림.

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

댓글

  • 좋고 철저한 대답, 이것은 임시 파일을 갖는 것보다 확실히 낫습니다!참을성이없는 사람들이 더 빨리 찾을 수 있도록 프로세스 대체 버전과 함께 처음에 TL; DR을 제공하는 것이 좋습니다. 🙂
  • Ubuntu 14.04 LTS에서 작동하지 않는 것 같습니다. ” / dev / fd / 63 is not a public key file ” 오류가 발생합니다. 하위 프로세스가 작동합니다.
  • @melleb 내가 액세스 할 수있는 12.04 시스템에서 동일한 것을 발견했습니다. 이전 OpenSSH 버전의 ssh-keygen에 FIFO / 명명 된 파이프에서 읽는 데 문제가있는 것 같습니다. 여유 시간이 생기면 ‘이 내용을 조사하고 답변을 업데이트하겠습니다.
  • @melleb 다양한 소스 코드 릴리스를 다운로드하는 데 시간을 보낸 후 do_fingerprint() 함수에 디버깅 printf 문을 삽입하면 7.2 이전 버전의 OpenSSH에서 ssh-keygen 파일을 읽기 위해 명명 된 파이프 (FIFO)를 잘 처리하지 못하여 프로세스 대체 방법이 작동하지 않습니다.
  • 이 방법은 작동하지만 지문을 확인하는 데 사용하는 경우 사용자는 ‘ 경쟁 조건이 있음을 알고 있어야합니다.이 명령으로 확인하는 지문은 ‘ 반드시 키의 지문이 아닙니다. ssh-keygen을 호출하기 전에 키를 덤프하지 않는 한 가져옵니다.

Answer

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

댓글

  • 이 예에서는 SSH가 항상 포트 22에서 실행되고 있다고 가정합니까? ssh가 비표준 포트에서 수신 대기하면 어떻게됩니까?
  • @MartinVegter (Guarin42를 패러 프레이징하여 ‘ t 주석 🙂 nmap에는 포트를 지정할 수있는 -p 옵션 (예 : -p 22000)이 있습니다. ‘는 -vv 옵션을 사용하여 상세도 (제공된 정보의 양)를 높일 수도 있습니다.

Answer

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

ubuntu linux 시스템에서이 명령을 사용하려면 다음 명령을 사용하십시오.

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

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

코멘트

  • 이것은 Ubuntu 18에서 저에게 효과적이지만 localhost 127.0.0.1에 대한 차이 결과를 얻을 수 있습니다. 또는 domain.tld. 관심있는 URL의 지문을 확인하세요 ~!

답변

다음은 쉘 스크립트입니다 (주로 Bourne 셸이지만 local 키워드를 사용합니다. 대부분의 최신 /bin/sh에서 사용 가능) 이렇게 작성했습니다.

. 지정된 호스트 이름 또는 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 "$@" 

설명

  • 명령 줄 옵션으로 하위 수준 도구를 래핑하는 멋진 데모입니다. 사용 방법에 대한 보너스가 포함되어 있습니다. 공유 메모리 /dev/shm가 그렇게 편리하다는 것을 전혀 몰랐습니다. 공유 에 감사드립니다!

답변

내 서버의 경우 다음을 사용합니다.

ssh-keygen -l -E md5 -f <(cat /etc/ssh/ssh_host_*_key.pub) ssh-keygen -l -E sha256 -f <(cat /etc/ssh/ssh_host_*_key.pub) 

답변

이미 액세스 권한이있는 경우 간단한 답변 서버에 :

ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub 

이제 RSA 키를 사용하지 않을 수 있습니다. 연결할 때 ssh

ECDSA 키 지문은 SHA256입니다. XXXXX

대신 /etc/ssh/ssh_host_ecdsa_key.pub를 사용해야합니다. (참고 _ecdsa_ ). 따라서 모든 키를 나열하는보다 보편적 인 명령을 생성 할 수 있습니다 ( source ) :

for f in /etc/ssh/ssh_host_*_key.pub; do ssh-keygen -lf "$f"; done 

서버를 설정할 때 나중에 참조 할 수 있도록 목록을 적어 둘 수 있습니다.또 다른 옵션은 DNS 레코드에 저장


ssh-keygen (1) 맨 페이지에서 :

-l 지정된 공개 키 파일의 지문을 표시합니다. RSA 및 DSA 키의 경우 ssh-keygen은 일치하는 공개 키 파일을 찾고 지문을 인쇄하려고합니다. -v와 결합하면 키의 시각적 ASCII 아트 표현이 지문과 함께 제공됩니다.

-f filename 키 파일의 파일 이름을 지정합니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다