投稿日

SORACOM Krypton client Golang バージョンを公開しました

みなさんこんにちは。
ソラコムのエンジニアの ogu です。

先日の弊社主催イベント SORACOM Discovery 2018 にて新サービスを 2 つ発表させていただきましたが、そのうちの一つ SORACOM Krypton に関するお知らせです。

SORACOM Krypton は SIM 認証にもとづくセキュアなプロビジョニングを行うためのサービスです。

「・・・ “SIM 認証にもとづくセキュアなプロビジョニング” って・・・?」

そう思われた読者の方も多いのではないでしょうか。
何を隠そう、私も当初はその一人でした。

詳しいことは Web 上に用意されているドキュメントをご確認いただくとして、誤解を恐れずにすごくいろいろなことをバッサリ切り捨てて簡単にいうと、

「あるグループに入っている SIM を使っている人にだけ、AWS の S3 の特定のオブジェクトにアクセスを許可したい」
「特定の SIM が挿入されているデバイスからだけ SORACOM Inventory を使いたい、しかも Wi-Fi 経由で」
「AWS IoT でデバイスに証明書を個別に入れなければならない手順を省きたい」

みたいなことが簡単かつ安全にできてしまうサービスです。

しかもそれはほんの一例で、他にもいろいろできることがありますので、ぜひ以下のドキュメントをご一読ください。

SORACOM Krypton(サービスご紹介)
SORACOM Krypton 開発者ガイド

もし、まだ良くわからないという場合は、

「IoT デバイスにクラウドの認証情報をもたせる(=プロビジョニングする)部分を、SIM の機能を使って安全に行うことができるのが Krypton である」

というふうに理解していただければ十分かと思います。

実際、Krypton なしで IoT デバイス側にクラウドサービスの認証情報をプロビジョニングしようと思うととても大変です。
たとえば AWS の認証情報(認証キーシークレットなど)をデバイス側に安全に格納するにはどうしたらよいでしょう?
デバイス 1 台ごとに異なる認証情報をプロビジョニングしなければならないとしたらどうでしょう?
そんな面倒を一手に肩代わりするのが Krypton です。

クライアントライブラリと CLI コマンド

さて、Krypton はほかの SORACOM サービスと同様、REST API 経由でご利用いただくことができます。

セルラー回線経由の場合は Krypton API を呼び出すだけですので、IoT デバイス上からお好きな言語のお好きなライブラリや curl コマンドなどで簡単に使えてしまいます。

セルラー回線を使わずに SORACOM Endorse による SIM 認証を利用する場合は、SIM 認証を行うために USB モデムやスマートカードリーダーなどのハードウェアを使って SIM に対して認証用のコマンドを発行する必要があります。
この部分が少しだけ難しいため、Krypton のリリースと同時にライブラリと CLI ツールをご提供して、簡単にお使いいただけるようにしておりました。

soracom-krypton-client-for-java

こちらをお使いいただくことで、セルラー通信は使わずに無線 LAN などで通信を行われるような状況でも、SIM の認証機能を使って安全に各種クラウドサービスへアクセスしていただくことができるようになります。

こちらのライブラリはその名前からもわかるとおり Java で書かれていますので、ポータビリティがあり、様々な環境でお使いいただくことができます。

一方で、実行には Java のランタイム環境が必要であるため、セットアップに多少手間がかかってしまったり、実行環境のディスク領域を大きく消費してしまうなどの声をユーザー様からいただいておりました。

そこで本日は、Go 言語で書かれたバージョンのクライアントを発表いたします。

krypton-client-go

Go 言語で書かれたクライアントは、事前にビルドされた単一の実行可能ファイルを、お使いになられる環境へコピーするだけでご利用いただけますのでセットアップの手間がかかりませんし、ファイルサイズも Java ランタイムに比べると控えめです。(ただし Linux 版はパッケージ管理システム等を用いて別途 libpcsclite をインストールしていただく必要があります。)

実際の使用例と使用上の注意点

ここからは Go 版のクライアントの使い方を実際にご紹介していきたいと思いますが、途中まではコマンド単体で実行できますが、途中からは SORACOM の SIM(グローバル SIM)とそれを読み取ったりするためのハードウェアが必要になります。

  • SIM
    SORACOM Air グローバル カード型 SIM
    plan01s もしくは plan01s-LowDataVolume のいずれかが必要です
  • スマートカードリーダー もしくは USB 接続タイプのモデム
    詳細は後ほど

これらが用意できない場合でも、コマンドの実行例を載せてありますので、雰囲気だけでも味わってみてください。

それでは Go 版のクライアントを試しに使ってみましょう。

まずはインストールです。
Go 版のクライアントのインストールはとても簡単です。

リリースページ からお使いの環境に対応したバージョンのファイルをダウンロードしてパスの通っているディレクトリに展開するだけです。

もしくは Go の処理系がすでにインストールされている場合は

go install github.com/soracom/krypton-client-go/cmd/krypton-cli

を実行することでもインストール可能です。

試しにお手元のパソコンにインストールしてみてください。

インストールすると以下のようにコマンドを実行できます。

krypton-cli

ただし、これだけだと

operation must be specified

というエラーメッセージとともにスタックトレースが表示されてしまいます。

operation という必須のパラメータを指定していないためにエラーになってしまっています。

利用可能なオペレーションの一覧は krypton-cli -h で確認することができます。

krypton-cli -h
  :
  -operation string
        Choose which type of provisioning API will be performed. (required)
        Possible values:
                bootstrapAwsIotThing                      perform bootstrap as an AWS IoT Thing
                bootstrapInventoryDevice                  perform bootstrap as an Inventory device
                generateAmazonCognitoOpenIdToken          generates an Open ID token using Amazon Cognito
                generateAmazonCognitoSessionCredentials   generates a temporary session token using Amazon Cognito
                getSubscriberMetadata                     gets subscriber's metadata
                getUserData                               gets userdata from group configuration
 :

このようなヘルプテキストが表示されるはずです。

いろいろなオペレーションが用意されていますが、今回は事前準備がほとんど不要なオペレーションとして getSubscriberMetadata を実行してみましょう。

事前準備が「ほとんど不要」とは言っても、SIM の所属グループの設定で メタデータと Krypton を ON にする必要があります。

新しいグループを作成するか、すでに所属しているグループの設定を開き、以下のようにメタデータと Krypton を ON にしてください。

どちらも、「保存」ボタンを押すことを忘れずに!!

この getSubscriberMetadata オペレーションは、SIM を使ったセルラー通信を行っていなくても(無線 LAN などでインターネットにつながっていても)、カードリーダーなどで SIM の認証を行い、SORACOM プラットフォームから SIM のメタデータを取得する、というものです。

SIM のメタデータにはタグなどの情報が含まれますから、デバイスへのプロビジョニングに使えるといいうわけです。

さっそく以下のようにコマンドを実行してみてください。

krypton-cli -operation getSubscriberMetadata

おそらく以下のようなエラーが表示されてしまったのではないでしょうか。

no UICC interface is found

エラーメッセージ中の「UICC」というのは SIM カードのことです。

SIM カードにアクセスするためのインターフェースとしては、スマートカードリーダーを用いる方法と USB モデムを用いる方法の 2 通りあります。

スマートカードリーダーは、たとえばこちらの商品で動作実績があります。
Gemalto ジェムアルト ICカードリーダ・ライタ PC USB-TR HWP119316
Gemalto ジェムアルト ICカードリーダ・ライタ PC USB-TR HWP117685

私は個人的にはこちらの折りたたみ式のカードリーダーを使っています。
Identive SCR3500
(折りたたむと非常にコンパクトなので便利なのですが、数年前に購入したときはもっと安かった記憶が・・・)

USB モデムは、ソラコムが販売しているものの中では Huawei MS2131i-8 のみが対応しています。
(AK-020 や、過去に販売していた FS01BU は残念ながら認証に用いる AT+CSIM コマンドに対応していないため、Krypton で Endorse 認証を行うためにはお使いいただけません。通常のセルラー回線経由の Krypton にはお使いいただけます)

ただし MS2131i-8 は、Mac と Linux では動作が確認できましたが Windows 10 では COM ポートとして認識されず利用できませんでした。
また、Mac であってもバージョン 10.13 (High Sierra) では動作しませんでした(10.11 と 10.12 では動作を確認しています)。

それから、USB ドングルの形ではありませんが、UC20-GEVB Kit の組み合わせであれば Windows でも使うことができました。

いずれにせよ、USB モデムは

  • OS に対応したドライバがある
  • COM ポートとして認識される
  • AT+CSIM コマンドに対応している

という 3 点をクリアしなければならないのですが、普通に通信には使えても COM ポートとしては見えないデバイスであったり(krypton client からは COM ポート経由で AT コマンドを送信する必要があります)、COM ポートが見えても AT+CSIM という認証のために使うコマンドに対応していない機種が多く、使えない場合が多いのが実情です。

スマートカードリーダーは上でご紹介した機種以外であっても、OS に対応したドライバさえインストールしてあれば基本的に使うことができると思いますので、Krypton をお試しになられる際はスマートカードリーダーの方をおすすめいたします。

動作確認済みのスマートカードリーダーと USB モデムは krypton-client-go の README などにまとめて行きたいと思いますので、皆様も試していただけましたらぜひ SNS などでお気軽に情報をお寄せいただければと思います。

ハードウェアの準備ができたら、SIM カードをスマートカードリーダー、もしくは USB モデムにセットし、PC に接続しましょう。

スマートカードリーダーをお使いになられる場合は、SIM カードを切り離したときの外側の部分が必要になる場合が多いです。
切り離す前の新品の SIM カードをお使いいただくか、切り離した後でも外側を取っておいてあればテープなどで元の配置に付け直してご利用いただく必要があります。
(ただし付け直す場合は自己責任でお願いします!!)

PC に接続したら、もう一度先程のコマンドを実行してみましょう。

krypton-cli -operation getSubscriberMetadata

少し時間がかかるかもしれませんが、以下のように SIM のメタデータが表示されたら大成功です!

{"imsi":"29505091xxxxxxx","msisdn":"42365xxxxxxx","ipAddress":"10.172.133.101","operatorId":"OP00xxxxxxxx","apn":"soracom.io","type":"s1.fast","groupId":"ce058ac2-4258-4982-ac5c-ad6d0e93cb17","createdAt":1488269944195,"lastModifiedAt":1533025626625,"expiredAt":null,"registeredTime":null,"expiryAction":null,"terminationEnabled":false,"status":"active","tags":{"name":"ogu test"},"sessionStatus":{"lastUpdatedAt":1529629619924,"imei":null,"location":null,"ueIpAddress":null,"dnsServers":null,"online":false},"imeiLock":null,"speedClass":"s1.fast","moduleType":"nano","plan":0,"iccid":"89423100xxxxxxxxxxx","serialNumber":null,"localInfo":{"status":"failed","lastModifiedTime":1532994883179},"subscription":"plan01s","expiryTime":null,"createdTime":1488269944195,"lastModifiedTime":1533025626625}

もしうまくいかない場合は、以下のように -debug オプションを付けて実行してみてください。

krypton-cli -operation getSubscriberMetadata -debug

詳細な動作ログが表示されますので、問題解決のための手がかりが得られるかもしれません。

他のオペレーションに関しては、以下のようなドキュメントをご用意しておりますのでいろいろ試してみてください。

KryptonでCognitoのクレデンシャルを取得し、S3からファイルをダウンロードする
Krypton を使用して AWS IoT の証明書を発行しデバイス登録する

さて、 krypton-cli の使い勝手はいかがでしたでしょうか?

ハードウェアの準備は必要ですが、IoT デバイス(に見立てた手元のパソコン)に、簡単にプロビジョニングできるということを実感していただけましたでしょうか?

ぜひ使ってみていただいて、フィードバックをお寄せください。

最後に

こんなマニアックな内容にもかかわらずここまで読んでいただいたあなたは素質がありますね。

ソラコムでは絶賛エンジニアを募集中です。ぜひ 採用ページ をご覧になってみてください。