鷲ノ巣

C# とか PowerShell とか。当ブログの記事は(特に公開直後は)頻繁に改定される場合があることをご了承ください。

AWS のキーのフィンガープリントが実行環境によって違う話

私はお仕事では AWS を使っています。
EC2 で立てた仮想マシンを操作する際には、SSH 鍵が必要です*1
今回は、その鍵の検証でハマったという話。

まず、こんな風にキーペアを作成します*2

できました。

フィンガープリントは b0:58:25:23:fe:47:ed:b4:b3:1a:67:08:31:07:aa:f5:19:12:00:49 となっています。

キーペアを作成すると、公開鍵は AWS に保存され、秘密鍵はローカルにダウンロードされます。

さて、ローカルにある秘密鍵が、本当にこの画面に表示されているものと同じかどうかを確認したくなったら、どうすればいいでしょうか。
そのための手順は AWS から公開されています。
docs.aws.amazon.com

具体的に言うと、こんなコマンドを使います。

openssl pkcs8 -in path_to_private_key -inform PEM -outform DER -topk8 -nocrypt | openssl sha1 -c

やってみましょう。

ん? なんか違うんじゃが?
50:ad:bc:cb:c7:34:d9:b9:e1:e3:2c:ac:41:8f:42:f1:f2:9b:39:65 と表示されています。

どういうことでしょうか。

PowerShell 5.1 で実行してみましょう。

やや、また違う値が表示されました!
今度は 81:67:4a:01:07:0e:07:a0:66:a0:f8:16:59:2c:e4:d9:93:a7:79:1b となっています。

ならばコマンド プロンプトなら?

おお、今度は一致しました!
ちゃんと b0:58:25:23:fe:47:ed:b4:b3:1a:67:08:31:07:aa:f5:19:12:00:49 と出ていますね。

念のため WSL でもやってみましょう。

はい、正しい値が表示されていますね。

ちなみに、Windows 環境での OpenSSL は、Git for Windows に付属しているものを使用しています。
WSL で実行しているものとは異なるバイナリですが、コマンド プロンプトから実行すると結果が一致しますので、OpenSSL 側の問題ではないと思います。

PowerShell でやると結果が異なってしまう理由はわかりませんが、おそらくはコマンド中に含まれるパイプ(|)の挙動に原因があるのではないかと思います。要注意ですね。

まとめ

ネイティブ コマンド*3をパイプ(|)でつないだものを実行するときは、PowerShell ではなくコマンド プロンプトを使いましょう。

追記

これですね。
github.com

現時点でマイルストーンが 7.4-Consider になっているので、次々リリースで修正されるのかもしれません。

*1:Linux マシンは言うに及ばず、Windows マシンでも、管理者のパスワードを取得する際などに使用します

*2:最近の流行りは ed25519 なのかもしれませんが、昔作ったキーについて調べていて困った話なので、今回は RSA です

*3:PowerShell のコマンドレットや関数でない、通常の実行ファイル