web-dev-qa-db-ja.com

SSHサーバーキーフィンガープリントを取得する

プログラムで SSHサーバーのキーフィンガープリントを取得する方法はありますか認証なし

私はしようとしています ssh -v user@Host false 2>&1 | grep "Server Host key"、ただし、鍵ベースの認証が設定されていない場合、これはパスワードを待機してハングします。

89
goncalopp

これを行うには、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は機能しません)

74
Andreas Wiese

私は最近これを自分で行う必要があったので、プロセス置換を使用して、これをどのように( OpenSSH 7.2以降のバージョンで)で)1行で実行できるかを示す回答を追加したいと思いました。

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リリースでは、フェッチされる default キータイプはrsa(バージョン5.1以降)、ecdsa(バージョン6.0以降)、およびed25519(バージョン6.7以降)。

古いバージョンssh-keyscan(OpenSSHバージョン5.1より前)では、 default のキータイプは古いrsa1(SSHプロトコル1)ので、キータイプを明示的に指定する必要があります。

ssh-keyscan -t rsa,dsa hostname

Base64キーの指紋ハッシュを取得する

ssh-keyscanは、SSHサーバーのホストキーを Base64-encoded 形式で出力します。これをフィンガープリントハッシュに変換するには、ssh-keygenユーティリティを-lオプションとともに使用して、指定した公開鍵のフィンガープリントを出力できます。

Bash、Zsh(またはKornシェル)を使用する場合、便利なワンライナーに プロセス置換 を使用できます。

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

:バージョン7.2より前のOpenSSHでは、ssh-keygenがファイルを読み取るために使用する関数は名前付きパイプ(FIFO)を適切に処理しなかったため、この方法は機能しませんでしたしたがって、一時ファイルを使用する必要があります。

ハッシュアルゴリズム

ssh-keygen printの最近のバージョンSHA256キーの指紋ハッシュ。 MD5サーバーキーフィンガープリントのハッシュ(古い動作)を取得するには、-Eオプションを使用してハッシュアルゴリズムを指定できます。

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

パイプラインを使用する

プロセス置換機能を備えていないPOSIXシェル(dashなど)を使用している場合、一時ファイルを使用する他のソリューションが機能します。ただし、OpenSSHの新しいバージョン(7.2以降)では、ssh-keygen-を標準入力ストリームのファイル名として受け入れ、1行のパイプラインコマンドを許可するため、単純なパイプラインを使用できます。

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

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 docs

21
Creek

filezillaは、md5でハッシュされたキーを16進数形式で表示します。

これをubuntu linuxマシンで見つけるには、次のコマンドを使用します。

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

注:「localhost」を、確認するマシンのIPに置き換えます。

3
Cameron

これは、私がこれを行うために書いたシェルスクリプトです(主にBourne Shellですが、localキーワードを使用しています。これは、最新の/bin/shで使用できます)。 ssh-hostkey hostnameのように使用します。指定されたホスト名またはIPアドレスのすべてのホストキーのsha256およびmd5形式のフィンガープリントが表示されます。 2番目の引数として「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 "$@"
1
ejm