認証せずにプログラムで 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
は機能しません)
コメント
。
回答
最近、自分でこれを行う必要があったので、プロセス置換を使用して、これを( 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
キーファイルのファイル名を指定します。
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以降で期待どおりに機能します。回答に記載されているように、STDERRへのコメント行を生成して除外できます。 er by AnthonyGeogheganまたはssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
2048 SHA256:gYz11pP/v/SMzUD58jrZ+m1EFC1pvyMxvIrg4PYlvDY
)古い形式で使用する場合は、-E md5
を指定すると、’のようなものが表示されます。 1d6a7ac1ea “>