EC2キーペアに登録されているキーのフィンガープリントについて確認してみる

EC2でインスタンスを構築する時は、キーペアに登録されている公開鍵を選択します。

EC2のマネジメントコンソール画面にはフィンガープリントが表示されており、本記事では表示されているフィンガープリントがファイルから計算するフィンガープリントとどう関係しているか確認してみます。

## ドキュメント

- [キーを確認する](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/verify-keys.html)
- [パブリックキーの説明](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/describe-keys.html#retrieving-the-public-key)

## 今回確認する事

EC2 キーペアのマネジメントコンソールに表示されるフィンガープリントについて。
下記2通りで用意したキーのフィンガープリントを確認します。

- マネジメントコンソールの　`キーペアを作成` から作成したキー
- マネジメントコンソールの　`アクション`　＝＞　`キーペアをインポート`　からインポートしたキー

なぜ手法ごとに確認するかといえば、AWSドキュメントの[フィンガープリントの計算方法](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/verify-keys.html)に下記のようにまとめられています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/d31ceb1e-393d-4d96-31b0-bf4d9aaaaebb.png)
[フィンガープリントの計算方法より引用](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/verify-keys.html)

表にあるように、RSAキーペアの場合。
キーを用意する手法によってフィンガープリントの計算方法が代わり値がかわります。

このためそれぞれの手法で用意したキーについて、それぞれ方法で取得したフィンガープリントを確認します。

## 余談

EC2のキーペアに表示されるフィンガープリントについて。
RSAの場合、AWS上で生成した場合と、インポートした場合で結果が変わってくるので。

AWS側で生成したRSAキーペアを、別リージョンで利用したい場合。
別リージョンのキーペア画面から公開鍵をインポートして利用することになりますが。

AWS側で生成したRSAキーとインポートしたRSAキーではフィンガープリントの計算で利用するハッシュ関数が違うので表示が変わります。

これは知らないとちょっと驚く挙動かと思います。

## 今回実行する環境

- Windows 10 21H2 
- [OpenSSH_for_Windows_9.1p1, LibreSSL 3.6.1](https://github.com/PowerShell/Win32-OpenSSH)
- [OpenSSL 3.0.8 7 Feb 2023 (Library: OpenSSL 3.0.8 7 Feb 2023)](https://slproweb.com/products/Win32OpenSSL.html)

本手順でフィンガープリントを確認するためには`ssh-keygen`と`openssl`が必要となります。

最近のWindows 10やWindows 11ならばOepnSSHはデフォルトでインストールされていると思いますが。
OpenSSLについては適宜インストールしておいて下さい。
（もしくはドキュメントにあるように、WSLで確認）

また今回実行する環境はPowerShellではなくコマンドプロンプトで実行してください。

2023年2月現在、PowreShell上で`openssl`の結果をパイプするとまずいことがあり、異なるフィンガープリントが表示されてしまいます。

この現象については下記ページが詳しいので勉強になります。

[AWS のキーのフィンガープリントが実行環境によって違う話](https://tech.blog.aerie.jp/entry/2022/09/12/124444)

## Amazon EC2 によって作成されたキーペアについて確認する

今回、確認用に下記２つのキーをマネジメントコンソールの`キーペアを作成`から作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/7e1e7bdb-655c-b46a-d559-7e44e7e09fe9.png)

| Name | Type | Fingerprint |
| --- | --- | --- |
| qiita-rsa | rsa | 	`8d:c1:49:18:b3:b0:dd:6d:de:f5:73:16:00:ec:6d:10:75:60:a8:43` |
| qiita-ed25519 | ed25519	| 	`aDxDMPGCAtcdh5W0hDgyhaNLtF0yhng+lG+KodwyJYw=` |

この２つのキーについては、Amazon EC2 によって作成されたキーペアとなり。

- qiita-rsa は rsa で　sha-1
- qiita-ed25519 は ed25519 で SHA-256

で計算されたフィンガープリントがコンソールに表示されています。

作成時にダウンロードしたキーについては、今回`c:\qiita\key\`に格納しています。

[プライベートキーからフィンガープリントを生成する](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/verify-keys.html)

上記ドキュメントでは、キー生成時にダウンロードできる秘密鍵から公開鍵を取り出し、公開鍵のハッシュを取得する方法を紹介しているため、こちらをつかって確認します。

```cmd:コマンドプロンプト
rem ###qita-rsa.pemのフィンガープリントを表示###
openssl pkcs8 -in qiita-rsa.pem -inform PEM -outform DER -topk8 -nocrypt | openssl sha1 -c

rem ###qiita-ed25519.pemのフィンガープリントを表示###
ssh-keygen -l -f qiita-ed25519.pem
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/b8171e76-cb4d-50fb-43e5-c57dd9a7e1d7.png)

コマンドを実行すると上記画像の赤線部分にフィンガープリントが表示されます。

マネジメントコンソール上で表示されているフィンガープリントとも一致しており、キーペアについて確認する事ができました。

なお、qiita-ed25519.pemについては、ブラウザからダウンロードしたファイルをそのまま利用しており、画像ではパーミッション警告が出ています。

最初パーミッション警告が出ていたので、ファイルのセキュリティから継承を切って不要なアクセス権限を外そうかと思いましたが、警告のあとにフィンガープリントが表示されていたので今回はそのままとしています。

# Amazon EC2 にインポートされたキーについて確認してみる（RSAのみ）

ブラウザからダウンロードした秘密鍵（qiita-rsa.pem qiita-ed25519.pem）から公開鍵を取り出して、取り出したファイルをAWS EC2にインポートしてみます。

[パブリックキーマテリアルを取得する](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/describe-keys.html#retrieving-the-public-key)

上記ドキュメントにキー登録されている公開鍵を取得する手法がいくつか記載されていますが、今回は`From the privae key`で紹介されている方法で公開鍵を取得します。

マネジメントコンソールからダウンロードしたファイルに対して、`ssh-keygen`コマンドを実行するとパーミッションエラーがでる場合は、ファイルのセキュリティから継承の無効化をして自分だけの権限をいい感じにつけて下さい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/7bd06c81-0e72-848f-2bf9-fce13d289fbb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/81f8f024-0bf9-979f-0e0d-757afa6c15dd.png)

上記画像の用に不要なユーザー（AdministratorsだったりSYSTEMだったり余計な権限を外していい感じにする）

パーミッションをいい感じした後に、コマンドを実行すると公開鍵が表示されるので、表示された内容をそれぞれマネジメントコンソールからインポートします。

コマンドを実行して公開鍵を表示

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/e4a9f72b-f7a6-c97a-1dc2-261e52557388.png)

マネジメントコンソールのキーペア画面から　`アクション`　＝＞　`キーペアをインポート`　を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/acf51a81-24ab-b044-620b-c55d8de00df4.png)

qiita-rsa-from-private-key

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/bf738ed2-b770-15d6-ded9-19f52ff0e9e4.png)

qiita-ed25519-from-private-key

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/3ff1847f-e840-0901-afe8-6262dbddc6e8.png)

キーペアがインポートされました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/2905f093-0392-eceb-ae58-5fa9cbd73f6f.png)


| Name | Type | Fingerprint |
| --- | --- | --- |
| qiita-rsa-from-private-key | rsa | 	`50:6a:ee:f4:cd:32:ec:09:30:2c:ff:a4:79:21:dd:c7` |
| qiita-ed25519-from-private-key | ed25519	| 	`aDxDMPGCAtcdh5W0hDgyhaNLtF0yhng+lG+KodwyJYw=` |

インポートされたフィンガープリント　と　AWSが生成したキーのフィンガープリントを比較すると。

ed25519の鍵の方はフィンガープリントが変化していない事がわかりますが。

rsaの方はインポートした事により、フィンガープリントの計算に利用するハッシュ関数が　sha1 から　MD5　に変わって、フィンガープリントも変わっている事が確認できます。

ここではインポートで変更されたrsaのフィンガープリントについて確認してみます。

先程、コマンドでインポートした公開鍵を下記コマンドで`qiita-rsa-from-private-key`に出力します。

この公開鍵について確認してみます。

```cmd:コマンドプロンプト
rem　秘密から公開鍵を取り出す
ssh-keygen -y -f qiita-rsa.pem>qiita-rsa-from-private-key

rem 取り出した公開鍵をPEM形式して、それをDER形式にしてmd5で計算
ssh-keygen -f qiita-rsa-from-private-key -e -m PEM | openssl rsa -RSAPublicKey_in -inform PEM -outform DER | openssl md5 -c
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/dd8aac7d-ee5d-63af-743e-a019905c03eb.png)

取得できるフィンガープリントを確認すると、マネジメントコンソールに表示されている`50:6a:ee:f4:cd:32:ec:09:30:2c:ff:a4:79:21:dd:c7`と一致している事が確認できます。

なおドキュメントにはもっと単純に下記のように秘密鍵から公開鍵を取り出して確認するコマンドが記載されています。

```cmd:コマンドプロンプト
openssl rsa -in qiita-rsa.pem -pubout -outform DER | openssl md5 -c
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/cdcea600-8ac7-a762-73b6-8e25c896ac09.png)

## ed25519の場合はフィンガープリントは生成手法によってかわらない

何度も出てきていますが、ed25519についてはAWS側で生成しても、インポートしてもフィンガープリントの計算方法が変わらないので一致している事が確認できれば終了。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/a5e1b01b-99da-0e45-b58e-425ffbb8aed3.png)

## 総評

鍵の棚卸しする際はフィンガープリントで確認しますが。
下記の点は意識しておくとよいかと思います。

- rsaではAWS側で生成した時とインポートした時では計算に利用するハッシュ関数が変わってフィンガープリントが変わる
- Win32OpenSSLを使う場合は、2023年2月現在のPowerShellで実行するとパイプ処理でまずいのでコマンドプロンプトを利用する