Lấy dấu vân tay máy chủ SSH


82

Có cách nào để lập trình lấy dấu vân tay của máy chủ SSH mà không cần xác thực không?

Tôi đang cố gắng ssh -v user@host false 2>&1 | grep "Server host key", nhưng điều này bị treo chờ mật khẩu nếu auth dựa trên khóa không được thiết lập.

Câu trả lời:


71

Bạn có thể làm điều này bằng cách kết hợp 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

(tiếc là đơn giản hơn nhiều ssh-keyscan host | ssh-keygen -l -f /dev/stdinkhông hoạt động)


1
Có lẽ ssh-keygen -l -f - <(ssh-keyscan host)nào, mặc dù?
một CVn

21
OpenSSH> = 7.2 ssh-keyscan có thể đọc từ stdin:ssh-keyscan host | ssh-keygen -lf -
mykhal

1
Chỉ cần làm:ssh-keygen -l -f <(ssh-keyscan host)
Christopher

1
Đó là một biểu hiện khá tệ cho các tập lệnh shell, vì nó phụ thuộc vào trình bao hỗ trợ nó, mà trình bao POSIX không.
Andreas Wiese

2
ssh-keygen -l -f -không hoạt động nhiều như mong đợi trong ssh-keygen 7.2 trở lên. Nó tạo ra một số dòng bình luận cho STDERR có thể được lọc ra, như được đề cập trong câu trả lời của Anthony Geoghegan hoặcssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
Cedric Knight

56

Gần đây tôi đã phải tự làm điều này vì vậy tôi nghĩ rằng tôi đã thêm một câu trả lời cho thấy cách thực hiện điều này (với các phiên bản OpenSSH 7.2 hoặc mới hơn ) trong một dòng bằng cách sử dụng thay thế quy trình:

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

Văn bản sau đây giải thích cách các lệnh này hoạt động và nêu bật một số khác biệt về hành vi giữa các phiên bản cũ hơn và mới hơn của các tiện ích OpenSSH.

Lấy khóa máy chủ công cộng

Các ssh-keyscanlệnh được phát triển để người dùng có thể có được host key nào mà không cần phải xác thực đến máy chủ SSH. Từ trang người đàn ông của nó:

ssh-keyscanlà một tiện ích để thu thập các khóa máy chủ ssh công khai của một số máy chủ lưu trữ. Nó được thiết kế để hỗ trợ xây dựng và xác minh ssh_known_hostscác tập tin.

Loại chính

Loại khóa cần tìm nạp được chỉ định bằng -ttùy chọn.

  • rsa1 (Giao thức SSH lỗi thời phiên bản 1)
  • rsa
  • dsa
  • ecdsa (các phiên bản gần đây của OpenSSH)
  • ed25519 (các phiên bản gần đây của OpenSSH)

Trong các bản phát hành OpenSSH hiện đại, các loại khóa mặc định được tìm nạp là rsa (kể từ phiên bản 5.1), ecdsa(kể từ phiên bản 6.0) và ed25519(kể từ phiên bản 6.7).

Với các phiên bản cũ của ssh-keyscan(trước OpenSSH phiên bản 5.1), các mặc định loại chính là out-ngày rsa1(SSH Nghị định thư 1) để các loại chìa khóa sẽ cần phải được quy định một cách rõ ràng:

ssh-keyscan -t rsa,dsa hostname

Nhận băm dấu vân tay của các phím Base64

ssh-keyscanin khóa máy chủ của máy chủ SSH ở định dạng được mã hóa Base64 . Để chuyển đổi điều này thành băm dấu vân tay, ssh-keygentiện ích có thể được sử dụng với -ltùy chọn của nó để in dấu vân tay của khóa chung được chỉ định.

Nếu sử dụng Bash, Zsh (hoặc vỏ Korn), có thể sử dụng thay thế quy trình cho một lớp lót tiện dụng:

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

Lưu ý : Với các phiên bản OpenSSH trước 7.2, các chức năng được sử dụng ssh-keygenđể đọc tệp, không xử lý tốt các đường ống có tên (FIFO) nên phương pháp này sẽ không hoạt động, do đó yêu cầu sử dụng các tệp tạm thời.

Thuật toán băm

Các phiên bản gần đây của ssh-keygenbản in dấu vân tay SHA256 của các phím. Để có được băm MD5 của dấu vân tay khóa máy chủ (hành vi cũ), -E tùy chọn có thể được sử dụng để chỉ định thuật toán băm:

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

Sử dụng đường ống

Nếu sử dụng trình bao POSIX (chẳng hạn như dash) không có tính năng thay thế quy trình, các giải pháp khác sử dụng tệp tạm thời sẽ hoạt động. Tuy nhiên, với các phiên bản mới hơn của OpenSSH (kể từ 7.2), một đường ống đơn giản có thể được sử dụng vì ssh-keygensẽ chấp nhận -làm tên tệp cho luồng đầu vào tiêu chuẩn, cho phép lệnh đường ống một dòng.

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

Câu trả lời hay và kỹ lưỡng, điều này chắc chắn tốt hơn là có một tập tin tạm thời! Tôi có thể đề nghị bạn cung cấp TL; DR ngay từ đầu với phiên bản thay thế quy trình, để làm cho những người thiếu kiên nhẫn tìm thấy nó nhanh hơn không? :)
goncalopp

3
Dường như không hoạt động trên Ubuntu 14.04 LTS; Tôi gặp lỗi "/ dev / fd / 63 không phải là tệp khóa công khai". Quá trình con không hoạt động.
Melle

@melleb Tôi tìm thấy điều tương tự trên hệ thống 12.04 mà tôi có quyền truy cập. Tôi nghi ngờ rằng ssh-keygentừ các phiên bản cũ hơn của OpenSSH có vấn đề khi đọc từ đường ống có tên là FIFO /. Tôi sẽ xem xét điều này (và cập nhật câu trả lời của tôi) khi tôi có thời gian rảnh.
Anthony Geoghegan

3
@melleb Sau khi dành thời gian tải xuống các bản phát hành mã nguồn khác nhau và chèn các printfcâu lệnh gỡ lỗi trong do_fingerprint()hàm, tôi thấy rằng với các phiên bản OpenSSH trước 7.2, các hàm được sử dụng ssh-keygenđể đọc tệp, không xử lý tốt các ống có tên (FIFO) phương pháp thay thế quá trình sẽ không hoạt động.
Anthony Geoghegan

Điều này hoạt động, nhưng nếu sử dụng nó để xác minh dấu vân tay, người dùng nên lưu ý rằng có một điều kiện chủng tộc: dấu vân tay bạn đang kiểm tra bằng lệnh này không nhất thiết phải là khóa bạn lấy, trừ khi bạn đổ khóa trước khi gọi ssh- keygen trên đó.
CodeGnome

20

nmapcung cấp khả năng này bằng cách sử dụng ssh-hostkeytập lệnh.

Để trả về dấu vân tay thập lục phân của khóa:

$ nmap [SERVER] --script ssh-hostkey

Để trả về nội dung của khóa:

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

Để trả lại bong bóng trực quan của khóa

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

Để trả lại tất cả những điều trên:

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

Nguồn: tài liệu nmap


3
Những ví dụ này có cho rằng SSH luôn chạy trên cổng 22 không? Nếu ssh nghe trên một cổng không chuẩn thì sao?
Martin Vegter

3
@MartinVegter (paraphrasing Guarin42, người không thể bình luận :) nmap có -ptùy chọn mà có thể chỉ định một cổng, ví dụ -p 22000. Bạn cũng có thể sử dụng -vvtùy chọn để tăng mức độ chi tiết (lượng thông tin đã cung cấp)
goncalopp

2

filezilla hiển thị các khóa được băm với md5 ở định dạng thập lục phân .

để tìm thấy điều này trên máy linux Ubuntu của bạn, hãy sử dụng lệnh này:

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

lưu ý: thay thế "localhost" bằng ip của máy bạn muốn kiểm tra.


1

Đây là một kịch bản shell (chủ yếu là shell Bourne nhưng sử dụng localtừ khóa, có sẵn trong hầu hết các hiện đại /bin/sh) Tôi đã viết để làm điều này. Sử dụng nó như thế nào ssh-hostkey hostname. Nó sẽ hiển thị cả dấu vân tay định dạng sha256 và md5 cho tất cả các máy chủ lưu trữ cho tên máy chủ hoặc địa chỉ IP đã cho. Bạn cũng có thể chỉ định thủ công " md5" hoặc " sha256" làm đối số thứ hai để chỉ hiển thị định dạng cụ thể đó.

Nó sử dụng một tệp tạm thời thay vì đường ống để làm cho nó tương thích với các gói OpenSSH cũ hơn (như được mô tả trong các câu trả lời khác). Các tập tin tạm thời sử dụng /dev/shm(bộ nhớ chia sẻ) nếu có sẵn.

#!/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 "$@"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.