RSA鍵のフォーマットを作って見て変換して体験実習しみた

**環境**

- 鍵作りに使ったもの
    - ssh-keygen : Macにあるもの
    - Puttygen : Release 0.70
    - TeraTerm : Version 4.96
- クライアント側のOS
    - macOS Soerra Version 10.12.6
    - Windows10 Pro 64bit
- サーバ側のOS : CentOS7
    - Macの中のVirtualBoxにいます

## 鍵を作る方法
- [ssh-keygenでRAS鍵をつくってMacからCentOS7へ接続できるようにする](http://ponsuke-tarou.hatenablog.com/entry/2017/10/19/002727)
- [PuttygenでRAS鍵を作ってWindowsからCentOS7へ接続できるようにする](http://ponsuke-tarou.hatenablog.com/entry/2017/10/31/214624)
- [Tera TermでRAS鍵を作ってWindowsからCentOSへ接続できるようにする](http://ponsuke-tarou.hatenablog.com/entry/2017/11/01/225804)

## 鍵のフォーマット
### PEM形式
- 特徴1. `-----BEGIN xxxxxxxxxxxx -----`って書いてある
- 特徴2. 拡張子が`.pem`ってなってることがある
- :loudspeaker:鍵の末尾に「=」がつくことがある
    - Base64でエンコードしているので変換で余った部分に「=」が使われる
    - [Base64 - Wikipedia](https://ja.wikipedia.org/wiki/Base64)
- この形式を必要とするもの
    - SECSH形式の公開鍵と秘密鍵
    - OpenSSH形式の公開鍵

> .DERと同じASN.1のバイナリデータをBase64によってテキスト化されたファイルです。
ファイルの先頭に -- BEGIN... という行があるのをみたら「PEMだな」と思えば良いです。
opensslコマンドのデフォルトのエンコーディングなので、たとえば何も指定せずに鍵を生成すると PEM形式のファイルが作られます。
> [RSA鍵、証明書のファイルフォーマットについて - Qiita](https://qiita.com/kunichiko/items/12cbccaadcbf41c72735)


### SECSH形式(ssh.com)
- 特徴1. 公開鍵は、`---- BEGIN SSH2 PUBLIC KEY ----`って書いてある
    - Puttygenにおいて特に設定無しで出力すると拡張子は`.pub`になる
- 特徴2. 秘密鍵は、`---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ----`って書いてある

```shell-session:Puttygen製公開鍵
---- BEGIN SSH2 PUBLIC KEY ----
Comment: "{コメント}"
AAAA{最初の行}
{改行あり文字列}
---- END SSH2 PUBLIC KEY ----
```

### OpenSSH形式
- 特徴1. 公開鍵は、`ssh-rsa`で始まって全体が1行になっている
    - TeraTermにおいて特に設定無しで出力すると拡張子は`.pub`になる
- 特徴2. 秘密鍵は、`-----BEGIN RSA PRIVATE KEY-----`って書いてある
- この形式を必要とするもの
    - Tera Term

```shell-session:ssh-keygen製公開鍵
ssh-rsa AAAA{改行なし文字列} {ユーザ名}@{PC名}
```

```shell-session:TeraTerm製公開鍵
ssh-rsa AAAA{改行なし文字列} {ユーザ名}@{PC名}
```

```shell-session:Puttygen製の鍵をssh-keygenで変換した公開鍵
ssh-rsa AAAA{改行なし文字列}
```

```shell-session:ssh-keygen製秘密鍵
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,8B5E34DBBBC0801DDDC2A5A241775435

{改行あり文字列}
-----END RSA PRIVATE KEY-----
```

```shell-session:TeraTerm製秘密鍵
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,7C930B26ED8CEE374948185658236DAC

{改行あり文字列}
-----END RSA PRIVATE KEY-----
```

```shell-session:Puttygen製の鍵をPuttygenでOpenSSH形式に変換した秘密鍵
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,F3C7A665262E1B0D

{改行あり文字列}
-----END RSA PRIVATE KEY-----
```

### Putty形式
- 特徴1. 秘密鍵の拡張子は、`.ppk`
- 特徴2. :loudspeaker:この形式の公開鍵はない
- 特徴3. 秘密鍵は、`PuTTY-User-Key-File-2: ssh-rsa`って書いてある
- この形式を必要とするもの
    - Putty
    - WinSCP

```shell-session:Puttygen製秘密鍵
PuTTY-User-Key-File-2: ssh-rsa
Encryption: aes256-cbc
Comment: {コメント}
Public-Lines: 6
AAAA{最初の行}
{改行あり文字列}
Private-Lines: 14
{改行あり文字列}
Private-MAC: 811871db936602fd5c01593aa7273dcc79eab6e2
```


## 鍵のフォーマットを説明しているサイト集
- [RSA公開鍵のファイル形式とfingerprint - Qiita](https://qiita.com/hotpepsi/items/128f3a660cee8b5467c6)
- [ssh.com 形式の公開鍵を OpenSSH 形式に変換する](https://blog.cles.jp/item/6148)
- [puttygenで作成した鍵がGitHubやSSHで利用できない時の対応 - Qiita](https://qiita.com/pink/items/ada9fa6236594f8fc5e9)
- [ウインドウズでSSHクライアントを使おう](http://osksn2.hep.sci.osaka-u.ac.jp/~naga/miscellaneous/winssh/winsshb2.html)

## 鍵のフォーマットを変換する方法
```shell-session:ssh-keygenを利用する
Putty形式/SECS形式 > OpenSSH形式
$ ssh-keygen -i -f {公開鍵}.pub > authorized_keys

OpenSSH形式 > SECS形式
$ ssh-keygen -f {公開鍵} -e -m pem
```

- [PuTTYgenで以前に作成した秘密鍵の読み込み/秘密鍵から公開鍵を作成 - WinSCP](https://ja.osdn.net/projects/winscp/wiki/ui_puttygen)