認証せずにプログラムで 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以降で期待どおりに機能します。回答に記載されているように、STDERRへのコメント行を生成して除外できます。 er by AnthonyGeogheganまたはssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
  • 新しいバージョンのopenssh(少なくとも7.2)は、フィンガープリントをSHA256として表示します(例:2048 SHA256:gYz11pP/v/SMzUD58jrZ+m1EFC1pvyMxvIrg4PYlvDY)古い形式で使用する場合は、-E md5を指定すると、’のようなものが表示されます。 1d6a7ac1ea “>

回答

最近、自分でこれを行う必要があったので、プロセス置換を使用して、これを( OpenSSH7.2以降のバージョンで)1行で実行する方法を示す回答を追加します:

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

次のテキストは、これらのコマンドがどのように機能するかを説明し、OpenSSHユーティリティの古いバージョンと新しいバージョンの動作の違いのいくつかを強調しています。

公開ホストキーを取得する

ssh-keyscanコマンドは、ユーザーがSSHサーバーへの認証を必要とせずに公開ホストキーを取得できるように開発されました。マニュアルページから:

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以降)。

ividの古いバージョンを使用= “959be47752”>

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

ssh-keyscan -t rsa,dsa hostname 

Base64キーのフィンガープリントハッシュを取得

ssh-keyscanは、SSHサーバーのホストキーを Base64でエンコードされた形式。これをフィンガープリントハッシュに変換するには、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シェルを使用する場合( )、一時ファイルを使用する他のソリューションは機能します。ただし、OpenSSHの新しいバージョン(7.2以降)では、ssh-keygen-をファイル名として受け入れるため、単純なパイプラインを使用できます。標準入力ストリーム。1行のパイプラインコマンドが可能です。

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

コメント

  • 素晴らしく徹底的答え、これは一時ファイルを持つよりも確かに優れています!せっかちな人々がそれをより早く見つけられるように、最初にプロセス置換バージョンでTL; DRを提供することをお勧めしますか? 🙂
  • Ubuntu 14.04LTSでは機能しないようです。エラー” / dev / fd / 63は公開鍵ファイルではありません”が表示されます。サブプロセスは機能します。
  • @mellebアクセスできる12.04システムで同じものを見つけました。古いバージョンのOpenSSHのssh-keygenで、FIFO /名前付きパイプからの読み取りに問題があると思われます。 ‘空き時間ができたら、これを調べます(そして答えを更新します)。
  • @mellebさまざまなソースコードリリースのダウンロードに時間を費やした後デバッグ用のprintfステートメントをdo_fingerprint()関数に挿入すると、7.2より前のバージョンのOpenSSHでは、ssh-keygenはファイルを読み取るため、名前付きパイプ(FIFO)を適切に処理しなかったため、プロセス置換方法は機能しませんでした。
  • これは機能しますが、指紋の検証に使用する場合は、ユーザーは、’レース条件があることに注意する必要があります。このコマンドでチェックしている指紋は、必ずしもあなたのキーの指紋ではありません’ ssh-keygenを呼び出す前にキーをダンプしない限り、フェッチします。

回答

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オプションを使用して、冗長性(提供される情報の量)を増やすこともできます

回答

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

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

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

注:「localhost」を、確認するマシンのIPに置き換えてください。

コメント

  • これはUbuntu18で機能しましたが、localhost 127.0.0.1では異なる結果が得られることに注意してください。またはdomain.tld。関係するURLのフィンガープリントを確認してください〜!

回答

これがシェルスクリプトです(主にBourneシェルですが、localキーワードを使用しています。これは最新の/bin/shで使用できます)これを行うために作成しました。

。指定されたホスト名またはIPアドレスのすべてのホストキーのsha256形式とmd5形式の両方のフィンガープリントが表示されます。手動で「md5」を指定することもできます。 “または” sha256 “を2番目の引数として使用して、その特定の形式のみを表示します。

パイプの代わりに一時ファイルを使用して、古い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によると

ECCSA キーフィンガープリントはSHA256:XXXXX

代わりに/etc/ssh/ssh_host_ecdsa_key.pubを使用する必要があります。 ( _ecdsa_ に注意してください)。したがって、すべてのキーを一覧表示するより普遍的なコマンドを作成できます(ソース):

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

後で参照できるように、サーバーをセットアップするときにリストを書き留めることができます。もう1つのオプションは、それらをDNSレコードに保存することです


ssh-keygen(1)のマンページから:

-l 指定された公開鍵ファイルのフィンガープリントを表示します。 RSAおよびDSAキーの場合、ssh-keygenは一致する公開キーファイルを見つけようとし、そのフィンガープリントを出力します。 -vと組み合わせると、キーの視覚的なASCIIアート表現がフィンガープリントとともに提供されます。

-f filenameキーファイルのファイル名を指定します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です