秘密鍵 pemからppkファイル変換

ppkファイルテスト

AWS EC2で Linuxサーバーを構築したときなど、パスワードのような短いキーフレーズではなくpemという拡張子のファイルを秘密鍵としてダウンロードしてからsshでログインすることが一般的になっています。pemファイル(Privacy Enhanced Mail)は、Base64で符号化された文字列が入ったテキストファイルです。最初の行には「—–BEGIN RSA PRIVATE KEY—–」が入っています。このファイルを利用して作成したEC2サーバーへsshログインが出来ます。下記がmacOSを使ったsshでのログイン時のコマンドです。

ssh -i "***.pem" ユーザー@*.ap-northeast-1.compute.amazonaws.com

pemファイルがあればmacOSでは不自由なく作成したEC2へログインできるのですがWindowsの場合このpemファイルをppkファイル(PuTTY Private Key files)に変換する必要があるようです。このppkファイルへの変換ツールはPuTTYというツールでインターネットからダウンロードできます。PuTTYのダウンロードは下記URLです

https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html

64ビット版インストーラー 2020年9月現在putty-64bit-0.74-installer.msiファイルをダウンロードしダブルクリックでインストールすると「C:\Program Files\PuTTY」にいくつかのexe実行ファイルがインストールされていることが確認できます。Windows 10のアプリ一覧からPuTTYgenを実行します。

PuTTYgen起動
PuTTYgen起動

実行すると下のような[PuTTYgen Key Generator]画面が出てきます。その画面の中央少ししたに[Load]と書かれたボタンがあるのでクリックします。

PuTTYgen Key Generator画面
PuTTYgen Key Generator画面

オープンダイアログが出てきてpemファイルを選択しますがオープンダイアログは拡張子ppkしか選択できない状態なので画面下の[ファイル名]を「*.pem」に変更しエンターキーを押します。(エンターキーはパンパン叩かない)

ファイル名テキスト入力項目を「*.pem」に変更
ファイル名テキスト入力項目を「*.pem」に変更

ファイル一覧に目的のpemファイルが表示されたら「開く」ボタンをクリックします。成功した場合Successfullyダイアログが表示されいます。

Successfullyダイアログが
Successfullyダイアログ

[Save Private Key]ボタンをクリックしppkファイルを保存します。

ppkファイルを保存
ppkファイルを保存

ppkファイルの作成が出来たらコマンドプロンプトから下記のように「C:\Program Files\PuTTY\plink.exe」を用いテストを行います。

"C:\Program Files\PuTTY\plink.exe" -ssh ユーザー名@EC2サーバーIP -P 22 -i "ファイル名.ppk" -N -L 3307:127.0.0.1:3306

下のように「Access granted. Press Return to begin session.」と表示されればOKです。

Access granted. Press Return to begin session.
Access granted. Press Return to begin session.

Swift JSON文字列からenumへDecodeについて

Swift言語で、下記はシンプルなenumの書き方です。

enum MobileArmor {
    case bigro, zakrello
}

MobileArmorというenum(列挙型)を作成しました。このMobileArmorを変数に入れたい場合下記のように記述します。

let mobileArmor: MobileArmor = MobileArmor.zakrello

mobileArmor変数の中を.zakrelloに設定しています。この変数の状態によってswitch文で処理を変更したい場合下記のように書きます。

let mobileArmor: MobileArmor = .zakrello
switch mobileArmor {
case .zakrello:
    print("zakrello")
    break
case .bigro:
    print("bigro")
}

enumCaseIterableHashable, Codableなどをprotocolをつけることが可能です。

CaseIterableの場合AllCasesが使えるようになります。このAllCasesを使えば下記のコードのようにenumに設定している内容を確認することができます。

enum MobileArmor: CaseIterable {
    case bigro, zakrello
}
MobileArmor.allCases.forEach { print ( $0.self) }
型の内容をallCases.forEachで取得

enum型にHashableを設定した場合は、hashValuehash(into hasher: inout Hasher)が使えますがHashableを設定しなくてもhashValueなどは利用できるようでした。hash(into: &hasher)を設定するためのHasherは、任意のシーケンスを整数にマッピングするために使用できます。combine()とfinalize()をつかうようです。下記に例を書いてみますがあってるのか不明です。

enum MobileArmor: CaseIterable, Hashable {
    case bigro, zakrello
}
let mobileArmor: MobileArmor = .zakrello
var hasher1 : Hasher = Hasher()
hasher1.combine(128)
hasher1.finalize()
mobileArmor.hash(into: &hasher1)

Codableも他と同じく enumに設定できるprotocolです。Codableは下のコードのようにDecodableEncodableが合わさった機能を持っています。

public typealias Codable = Decodable  & Encodable

MobileArmor enum型にStringCodableを設定しました。Codableを指定しているので JSONのDecodeが可能です。

enum MobileArmor: String, Codable, CaseIterable, Hashable {
    case bigro = "ビグロ"
    case zakrello = "ザクレロ"
}

do {
    let amobileArmor = try JSONDecoder().decode(MobileArmor.self, from: "\"ザクレロ\"".data(using: .utf8)! )
    switch amobileArmor {
    case .zakrello:
        print("zakrello")
        break
    case .bigro:
        print("bigro")
    }
} catch { }

ザクレロ」という文字列をMobileArmor型にdecodeできました。JSONDecoderを使わない方法もあると思いますが、手っ取り早いコード例です。Codableが設定されているので、JSONEncoder()を使えば下のコードのように文字列に変換することもできます。

do {
    print( String(data: try JSONEncoder().encode(MobileArmor.bigro), encoding: .utf8)! )
} catch { }
2022 MJELD TECHNOLOGIES. ALL RIGHTS RESERVED