Trinsic Walletを利用したSSI/VCアプリを作ってみた


# はじめに
最近、SSI/VCの技術が話題となっています。日本政府のデジタル庁が提供しているアプリ「新型コロナワクチン接種証明書アプリ」においても、データの規格はSMART Health Card（SHC）であり、W3CのVerifiable Credentials（VC）に準拠しています。
そこで今回、SSI/VCの技術を使用して、個人の滞在情報とワクチンの接種情報を同時に記録するアプリを試作しました。

# 前提条件
前提条件として
・既存システムを組み合わせて実現する
・開発部分は極力少なくする
・特定のソリューションに特化しない
を意識してアプリを試作しました

# 使用技術
## 1.VC（Verifiable Credentials）
### 1-a) Issuer, Verifier, Holderについて
SSI(Self-Sovereign Identity)とは
管理者を介さずに自分自身でデジタルアイデンティーを保持しコントロールする事、すなわちプラットフォーマー(googleなど)が管理しているIDの主権を個人に返す考え方の事です。
VC（Verifiable Credentials）とは
SSIの思想を実現するモデルの事を指し、現実世界のCredential（運転免許証や社員証など）をオンライン化したものです。
「Issuerが発行した証明書をHolderが保有し、必要に応じてVerifierに提示する。Verifierはその証明書が正しいかを検証する」という仕組みで実装されています。
Trinsic Wallet　とは
VCモデルのHolderであり、今回はこれを利用します。
Trinsic WalletはTrinsic社が提供する無料のスマートフォンアプリで、複数のVCをウォレット内に保管することができます。

### Trinsic Walletのインストール手順

1. App Store にて[Trinsic Wallet]入手（無料）（2022･3･25時点　Ver3.2.0）
2. 起動して[GET STARTED]をタップ
3. Regionで[United states]が選択されたまま[continue]をタップ
4. Notifications は[ENABLE NOTIFICATIONS]をタップ
⇒インストール完了 （iPhoneにて確認）

|![home-ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221946/2f857808-b0d9-7644-30d1-0ccbf12a3b89.png)|
|:--|

図1-1. Trinsic Wallet ホーム画面



### 1-b)　利用するVC（デジタル証明書）
　　個人の滞在情報とワクチンの接種情報を同時に記録したいので、個人が識別できるIDカード的なVCとして「1.メールアドレス証明書」、SMART Health Card（SHC）の代わりに「2.独自ワクチン接種証明書」を使用しました。

### [1] メールアドレス証明書
個人が識別できるIDカードとして、カナダのBCGOVが発行しているメールアドレス証明書を使用しました。発行された証明書はTrinsic Walletに保管します。
### メールアドレス証明書発行手順
1. ブラウザで証明書発行サイトへアクセスします
https://email-verification.vonx.io/　　
2. ブラウザでメールアドレスを入力し「送信」ボタンを押します
3. メールが送信されますので、メールソフトでメールを受信します
4. メール内のリンクをクリックし、ブラウザで証明書発行サイトのQRコードを表示します(下図参照)
5. Trinsic Walletを起動します
6. Trinsic Walletにおいて、「Sovrin Staging」ネットワークを選択します（[SETTING]－[Network]）(下図参照)
7. ホーム画面の[SCAN CODE]ボタンをタップして、ブラウザのQRコードをスキャンします
⇒証明書発行サイトとTrinsic Walletの通信が始まります
8. Trinsic Walletで通知メッセージ「Email Verification Service has invited you to connect.」が表示されますので[ACCEPT]ボタンをタップしてください。(下図参照)
9. この間、ブラウザにおいては[Credential Exchange in Progress]画面が表示され、「Connection Formed」と「Credenial Issuerd」が順にチェックされます
10. Trinsic Walletにメールアドレス証明書が格納されます(下図参照)
⇒完了

|![email証明書-verifier画面.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221946/1a768a89-ac15-d625-ab40-83901defaa7e.jpeg)|
|:--|

図1-2. ブラウザ　証明書発行用QRコード(処理4)

|![7-ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221946/dfb40500-b553-ca0f-39cf-bfed4dff6226.png)|![3-ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221946/1066f212-b56c-dd59-c0a2-9b48ce440567.png)|![8-ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221946/a669cecf-d247-f80b-1bce-d36ea819b592.png)|
|:--:|:--:|:--:|
|ネットワーク設定(処理6)| 証明書の受け入れ確認(処理8)|メールアドレス証明書(処理10)|

図1-3. Trinsic Wallet

### [2] 独自ワクチン接種証明書（SMART Health Cardデータ含む）

現在デジタル庁から「新型コロナワクチン接種証明書アプリ」が提供されています。スマートフォンへアプリをインストールすることで、紙で発行されていいたワクチン接種証明書がスマートフォンで取り扱えるようになりました。
ワクチン接種証明書で扱っている情報はSMART Health Cardの規格にそっていますが、そのままTrinsic Walletへ格納することはできません。そこで今回、デジタル庁が発行したワクチン接種証明書と同等のものを独自ワクチン接種証明書として作成し、Trinsic Walletへ格納することにしました。

独自ワクチン接種証明書を発行する為には、Trinsicの分散型IDプラットフォームを使用します。TrinsicはHyperledger Indy/Ariesベースで数少ない商用レベルのPaaSプロダクトで、VC（Verifiable Credential）の発行、保有、検証を行うことができます。また制約はありますが、無料で利用することができます。今回Trinsicのプラットフォームを利用して、独自ワクチン接種証明書を発行し、内容にSMARTR Health Cardのデータを格納しました。

Trinsicプラットフォームは以下のサイトを参考にして使用しました
「分散型IDプラットフォーム Trinsicを触ってみた」
https://qiita.com/pirodate/items/250efb373904ac74f07d

|![cards-2ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221946/ee9cbaf9-5224-d3e1-202b-5ae0eb71daf4.png)|
|:--|

図1-4. メールアドレス証明書と独自ワクチン接種証明書

## 2. アプリとVCの連携について
### 2-a) アプリの提供形態について
VCを利用したアプリの提供形態には3種類あると考えています。
形態1）Webアプリのみでサービス提供。ブラウザ＋Trinsic Walletを利用する
形態2）スマホアプリでのサービス提供1。スマホアプリ＋Trinsic Walletを利用する
形態3）スマホアプリでのサービス提供2。スマホアプリのみ利用する
　
今回は、操作が少し面倒ですが、アプリのインストールが不要で開発が容易な「形態1」を採用しました。

### 2-b) deepLinkの利用
今回、VCの検証を行うVerifier部分については、認証認可で広く使われているOpenIDConnectの枠組みと連携するために、「vc-authn-oidc」を採用しました。
（vc-authn-oidcに関する説明は割愛します。別途、チームメンバーが投稿予定です。）
アプリ側は、vc-authn-oidcのサンプルプログラムのWebアプリをベースに作成しました。それにはdeepLinkの呼び出し機能があります。
deepLinkとはWebアプリ等から、スマートフォンアプリの特定コンテンツへ遷移するためのリンクの事です
このdeepLinkボタン(「Open in a Trusted Digital Wallet」ボタン)をタップすることで、Trinsic Walletが起動し、VCの提示要求が行われます。今回はメール証明書と独自ワクチン証明書を要求し、Verifierで検証しました。


![全体図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221946/9c60bb15-6e23-10e2-f7eb-18399db553a1.png)
図2-1. Trinsic Walletとブラウザの連携イメージ

|![deepLink-wnd-ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221946/706ced45-b5c9-e078-f3d0-013d87414e6b.png)|
|:--|

図2-2. スマホのブラウザ　検証用QRコードとdeepLinkボタン

### deepLinkのURL

|didcomm://launch?d_m=eyJAaWQiOiIxYjQyOGMzYS1lNWVjLTQ2NzgtYTR... |
|:--|

## 3. jsQR　(JavaScript の QRコードライブラリ)　
検証が通ったら、次は滞在情報を個人IDと紐づけて記録します。
今回はQRコードで位置情報を表示し、入室時や着席時にカメラで読み取る事にしました。
QRコードを読みとる部分は、JavaScript を用いた QRコードのデコードライブラリ「jsQR」を使用しました。使用前にカメラの利用許可の確認ダイアログが表示されますが、ブラウザのみでQRコードを読み取る事が便利です（iPhone上のSafariで確認済み）。
位置情報を読み取ったら、証明書内のメールアドレスやワクチン接種の是非を、システム時刻と一緒にDBに記録します
### jsQR利用手順
1. ライブラリをダウンロード
https://github.com/cozmo/jsQR
distフォルダ内のjsQR.js　がライブラリの本体ファイルです

2. jsQRを使用するコードを記述
jsQRは以下のサイトを参考にしました
「jsQRであっさりQRコードリーダ/メーカ」
https://zenn.dev/sdkfz181tiger/articles/096dfb74d485db
今回はQRコードの検出ができた時に、位置情報をデコードしました

3. SSL証明書を設定
httpではカメラが動作しなかった為、SSL証明書をサーバーへ設定してhttpsで通信しました
証明書はZeroSSLから無料で取得しました
「ZeroSSL」 https://zerossl.com/

![scan-qr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221946/1ca529b6-a7d8-99fa-3076-6f20679f25fa.png)
|:--|

図3-1　位置QRコードの読み込み

# 構想
DBには各自のメールアドレスに紐づけされた位置情報と時刻、ワクチン接種情報が記録されています。現在は、DBに格納されている情報をそのまま表示する機能しかありませんが、もしもソリューションとして実装する事になれば、滞在記録のデータはAPIとして提供することを考えています。
本アプリは滞在情報を記録するのみで、分析などの複雑な処理は別のアプリケーションで行うつもりです。

# おわりに
今回は、SSI/VCの技術を使用して、個人の滞在情報とワクチンの接種情報を同時に記録するアプリを試作しました。
現在はワクチン接種証明書がVCとして提供されていますが、今後は他にもVC化された証明書が提供され、それらを利用した様々なサービスが提供されると思います。機会があれば引き続きSSI/VC関連を色々試して、情報提供していきたいと思います。

# 参考情報
新型コロナワクチン接種証明書アプリ
https://www.digital.go.jp/policies/posts/vaccinecert
Trinsic Wallet
 https://trinsic.id/trinsic-wallet/
Trinsic 
 https://trinsic.id/
メールアドレス証明書
 https://email-verification.vonx.io/　　
Qiita「分散型IDプラットフォーム Trinsicを触ってみた」
https://qiita.com/pirodate/items/250efb373904ac74f07d
jsQR　
 https://github.com/cozmo/jsQR
Zenn「jsQRであっさりQRコードリーダ/メーカ」
https://zenn.dev/sdkfz181tiger/articles/096dfb74d485db
ZeroSSL 
https://zerossl.com/