인증없이 프로그래밍 방식으로 SSH 서버 키 지문을 얻을 수있는 방법이 있습니까? >에?
ssh -v user@host false 2>&1 | grep "Server host key"
를 시도하고 있지만 키 기반 인증이 설정되지 않은 경우 비밀번호를 기다리는 동안 멈 춥니 다.
답변
ssh-keyscan
및 ssh-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 서버에 인증 할 필요없이 공개 호스트 키를 얻을 수 있도록 개발되었습니다. 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
nmap
는 ssh-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
키 파일의 파일 이름을 지정합니다.
ssh-keygen -l -f - <(ssh-keyscan host)
가 가능할까요?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 -
2048 SHA256:gYz11pP/v/SMzUD58jrZ+m1EFC1pvyMxvIrg4PYlvDY
) 이전 형식을 원할 경우-E md5
를 제공하면 ‘ .