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


82

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

私は試みssh -v user@host false 2>&1 | grep "Server host key"ていますが、キーベースの認証が設定されていない場合、これはパスワードを待ってハングします。

回答:


71

あなたは組み合わせることにより、これを行うことができます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ものは動作しません)


1
たぶんssh-keygen -l -f - <(ssh-keyscan host)そうですか?
CVn 14

21
OpenSSH> = 7.2 ssh-keyscanはstdinから読み取ることができます:ssh-keyscan host | ssh-keygen -lf -
mykhal

1
ただ:ssh-keygen -l -f <(ssh-keyscan host)
クリストファー

1
POSIXシェルがサポートしていないシェルをサポートしているシェルに依存するため、これはシェルスクリプトにとってはかなり悪い表現です。
アンドレアスヴィーゼ

2
ssh-keygen -l -f -ssh-keygen 7.2以降で期待どおりに機能します。それはアンソニーGeogheganかによって答えで述べたように、除外することができるSTDERRにいくつかのコメント行を生成ssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
セドリック・ナイト

56

私は最近自分でこれをしなければならなかったので、プロセス置換を使用して1行でこれをどのように行うことができるかを示す答えを追加すると思いました(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以降)です。

では古いバージョン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シェル(など)を使用している場合、一時ファイルを使用する他のソリューションが機能します。ただし、OpenSSHの新しいバージョン(7.2以降)では、標準入力ストリームのファイル名としてssh-keygen受け入れ-られるため、シンプルなパイプラインを使用でき、1行のパイプラインコマンドを使用できます。

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

素敵で徹底的な答え、これは一時ファイルを持つよりも確かに優れています!せっかちな人たちがより早く見つけられるように、プロセス置換バージョンの最初にTL; DRを提供することをお勧めしますか?:)
goncalopp

3
Ubuntu 14.04 LTSでは動作しないようです。「/ dev / fd / 63は公開鍵ファイルではありません」というエラーが表示されます。サブプロセスは機能します。
メレ

@melleb 12.04システムで、アクセスできるのと同じものを見つけました。ssh-keygen古いバージョンのOpenSSHでは、FIFO /名前付きパイプからの読み取りに問題があると思われます。空き時間ができたら、これについて調べます(そして、答えを更新します)。
アンソニージョゲガン

3
@mellebさまざまなソースコードリリースをダウンロードprintfしてdo_fingerprint()関数にデバッグステートメントを挿入すると、ssh-keygenファイルを読み取るために使用される関数がOpenSSHの7.2より前のバージョンでは名前付きパイプ(FIFO)をうまく処理できないことがわかりました。プロセス置換メソッドは機能しません。
アンソニージョゲガン

これは機能しますが、指紋を検証するために使用する場合、ユーザーは競合状態があることに注意する必要があります:このコマンドでチェックしている指紋は、ssh-を呼び出す前にキーをダンプしない限り、必ずしもフェッチしたキーの指紋ではありませんそれのkeygen。
-CodeGnome

20

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 docs


3
これらの例では、SSHが常にポート22で実行されていると想定していますか?sshが非標準ポートでリッスンする場合はどうなりますか?
マーティンベガー14

3
@MartinVegter(コメントできないGuarin42の言い換え:) nmapには、-pポートを指定できるオプションがあります-p 22000。この-vvオプションを使用して、詳細度(指定された情報量)を増やすこともできます
-goncalopp

2

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

あなたのubuntu Linuxマシンでこれを見つけるには、次のコマンドを使用します:

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

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


1

これはシェルスクリプトです(主にBourneシェルですが、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 "$@"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.