ラベル Decentralized Identifiers の投稿を表示しています。 すべての投稿を表示
ラベル Decentralized Identifiers の投稿を表示しています。 すべての投稿を表示

2024年7月20日土曜日

DIFがDWNサービスを開発者向けに無償提供!

こんにちは、富士榮です。


先日書いた通り、DIF(Decentralized Identity Foundation)がDWN(Decentralized Web Node)に関するイベントを日本時間の19日のAM1時からやりました。

DWNの説明図(DIFより)


その中で大きな発表がありました。
The Decentralized Identity Foundation (DIF) today announced a Free Managed Decentralized Web Node service for developers, operated by DIF leveraging Google Cloud technology. 

そう、Universal Resolverに続いてDWNもDIFが無料で開発者向けに提供を始めました!

ざっくり概要です。
  • Google Cloud上で提供される
  • DID一つにつき1GBのストレージが用意される
  • 7/17-19でベルリンで開催中のWeAreDeveloper World Congress 2024でDanielとMarkusが発表する
こちらのサイトで使い始められるようです。TBDのAPIでWeb5アプリが作れるぞ、という建て付けになっていますね。

触らないといけないものが増えすぎて時間が取れていませんが、余裕ができたらもう少し深掘りしてみようと思います。


2024年6月13日木曜日

cheqdのDID Resolverを試してみる②

こんにちは、富士榮です。

一昨日に引き続きcheqdのDID Resolverを試してみます。

今回は手元に環境をセットアップしてみようと思います。


まずは、gitのレポジトリのクローンをします。

git clone https://github.com/cheqd/did-resolver.git

そしてdocker compose。これでおしまいです。もちろんdocker-compose.ymlをいじってカスタマイズすることもできます。

docker compose -f docker/docker-compose.yml up --detach


これでlocalhostの8080で起動してきますので、curlなどでDIDを投げ込んで解決してみましょう。

まぁ、当たり前ですがちゃんと動きますね。

手軽にDID Resolverが手元で動かせる時代になってきましたね。良い意味でUniversal Resolverのみに頼らなくても良い時代がもう少しで到来しそうです。何しろ最終的にはリゾルバの信頼性が問題になってきてしまうので。

2024年6月11日火曜日

cheqdのDID Resolverを試してみる①

こんにちは、富士榮です。

そういえばDIFのUniversal Resolverばっかり使っていましたが、他にもオープンソースのDID ResolverとしてcheqdのDID Resolverもあるなぁ、ということでセットアップしてみたいと思います。

cheqdのWebサイト。最近よくあるVC関係のプラットフォームを提供している会社ですね。(VC-JWT、JSON-LD、AconCredに対応しているようです)


こちらに開発者向けドキュメントがあり、dockerにセットアップする方法が書かれています。

https://docs.cheqd.io/identity/advanced/did-resolver


なお、https://resolver.cheqd.net/でホストされているものをそのまま使うことも可能ですので手軽に試したい場合はこちらでも良いと思います。

まずは今日は手始めにこちらから試してみようと思います。

こんな感じのサンプルが掲載されています。

curl -X GET https://resolver.cheqd.net/1.0/identifiers/did:cheqd:testnet:55dbc8bf-fba3-4117-855c-1e0dc1d3bb47

細かいですが、サンプルのDIDのDID Documentが帰ってきますね。

ちなみに、サンプルはdid:cheqdという独自メソッドですが、他のメソッドへの対応状況はどうなっているのかみてみます。とりあえず手元にあったdidがionとwebだったので試してみましたが、両方ともNGでした。。。。

    "error": "methodNotSupported",

って言われます。

 

ドキュメントを見ると、

The resolver.cheqd.net API endpoint is run by the cheqd team and only handles did:cheqd credentials.

If you want to resolve DIDs from multiple DID methods, the Universal Resolver project provides a multi DID method resolver.

とありますね。要するに他のDIDを解決したければUniversal Resolverを使え、と。まぁ仕方がないですね。

ちなみに逆にUniversal Resolverでdid:cheqdのDIDは解決することができました。



次回は手元にセットアップしてみたいと思います。






2024年1月2日火曜日

did:webの課題をカバーするdid:websがパブリックレビューへ

こんにちは、富士榮です。

みなさん大好きなdidメソッドの話です。

結局did:webが結構使われてるけどdid:webって既存のwebサイトの管理方法(DNSとかCA)に依存しちゃうので分散型じゃないよね、という課題(?)をカバーするためにdid:websっていうのをToIP(Trust Over IP) Foundationのdid:webs Method Task Forceで検討して仕様策定している、ということのようです。

ToIP Foundationからのアナウンス

https://trustoverip.org/news/2023/12/15/announcing-public-review-of-the-didwebs-method-specification/


個人的には結局インターネット上でDIDを使うユースケースに限っていえば既存のインターネットの仕組みであるDNSのレジストラやHTTPSのCA局のポリシーやガバナンスを信頼する必要があるはずなので、そこまで分散型に拘る必要性は感じない派なのですが・・・

did:webにおける課題

did:webに限らずdid全般において言えることですが、結局did、Decentralized Identifiersはつまるところ識別子なのでどうやってメソッド内の名前空間におけるユニークネスを担保するのかがポイントになります。ユニークネスを担保するためには多くの場合においてレジストリ(Trusted Data Registry)を構築し重複レコードがないことを管理することが必要となります。その際の登録〜管理プロセスを特定の管理主体(群)を通して行うモデルが従来のDNSやCA局などが取ってきたモデルです。一方で衆人環視の元、あらかじめ合意されたコンセンサスアルゴリズムに則ってレジストリへの登録〜管理を行うモデルがいわゆるブロックチェーンベースのレジストリ管理のモデルです。
一方でOpenID ConnectにおけるSIOPv1(v2と区別する意味であえてv1とつけます)における自己発行の証明書のThumbprintを識別子として用いる、つまり証明書のエントロピーに全振りし特定のレジストリを用いないモデルも存在します。
この辺りは上記のToIPからのアナウンスにも記載されていますが、整理するとdidメソッドにおける識別子の管理方法は、
  1. 権威ある管理主体を利用する方式
  2. ブロックチェーンを利用する方式
  3. 自己発行の証明書を利用する方式
に分類されるわけです。
前述の通りdid:webはdid:web:example.jp:users:taroの様にドメイン名を識別子に利用する上にDID Documentを取得するレジストリ(did.json)の正当性についてはHTTPSを用いるので1番めの権威ある管理主体を利用する方式に該当します。
しかしながら前述の通り、Decentralized Identifierというからには分散している方が良いのである、という主張も存在するわけで2番めのブロックチェーンを利用する方式なども依然として利用されている状態にあります。
この様なカオスがdidメソッドの乱立を招いてしまっているわけで、本ポストを書いている時点で186個もメソッドが登録されいる状態にありますし、もちろんW3Cのdidレジストリに登録せずにプライベートでdidを利用しているシステムも多数存在している状態となっています。

話を戻すと、分散型の必要性を主張するシナリオに対応するためにdid:webを拡張するのが今回のToIPのタスクフォースの対応だということになります。

did:websにおける対応

では、具体的にどの様な対応をしているのかを見ていきましょう。非常に単純です。
要するに従来のdid:webのDNS名前空間はそのまま利用し、最後に3番めの自己発行の識別子をくっつけることで対応しようという試みです。こんな感じの識別子ですね。
did:webs:example.jp:users(ここまではdid:web):xxxxxxxx(自己発行の識別子)

この最後の自己発行識別子の部分については既にToIP FoundationのACDC(Authenticated Chained Data Container) Task Forceで議論しているので、こちらを使おうという話の様です。いわゆるGLEIFがvLEIで採用しているKERI(Key Event Receipt Infrastructure)の話ですね。この辺りはIIW(Internet Identity Workshop)でも毎回活発に議論されています。

私もACDCやKERIについてはあまり知らないのでこれ以上は突っ込みませんが、did:web+ACDC=did:websって考えておけば良いのかな、、というぐらいの理解です。

まぁ、冷静に考えると結局のところDNSやHTTPSへの依存は一定以上残るわけなので、そこまで分散型に拘るなら素直にブロックチェーンベースのdidメソッドを使えば良いのでは?と思いましたが。。いずれにしてもユースケース次第ですね(という逃げ口上)。

2022年11月6日日曜日

発行済みVerifiable Credentialsの状態確認を行うStatus List 2021の仕様と動作

こんにちは、富士榮です。

今日はちょっとマニアックなところを。(完全に自分向けのメモです)


Microsoft Entra Verified IDは発行済みのVerifiable Credentialsの状態(有効・取り消し済み)を管理するためにDecentralized Identity Foundation(DIF)のStatus List 2021とIdentity Hubという仕様を使っています。

ちなみにその後Identity Hubはdecentralized web nodeという仕様になっているので、もうIdentity Hubの仕様はすでに古いものとなっています。

Decentralized Web Nodeの仕様


基本的にやりたいことはとしては、

  • 発行されたVerifiable Credentialの状態をHolderやVerifierは確認したい
  • ただ、Issuerに状態を問い合わせるのでは従来の集中モデルと変わらずプライバシー保護の観点などからも好ましくない
ということなので、Issuerに問い合わせしなくてもVerifiable Credentialの有効状態を確認できる必要があります。

ということでStatusList2021CredentialというタイプのVerifiable Credentialを発行し、IssuerのIdentity Hubに発行、他のノード等からIssuerが把握することなく閲覧が可能な状態を実現します。
なお、スケーラビリティへの考慮から発行済みVerifiable Credentialsのリストをなるべくコンパクトに保持する必要があり、ビット配列で状態を保持する形の仕様となっています。


今回はHolderやVerifier(主にはこちらが確認することが多いとは思いますが)などVerifiable Credentialを受け取ったエンティティがどのように有効性確認を行うのか?について触れたいと思います。(あくまで現時点でのMicrosoft Entra Verified IDでの実装をベースにしています)

■大まかな流れ

大まかにはこんな流れです。
  1. Verifiable Credentialを受け取る
  2. 受け取ったVC内のCredentialStatusを取得(主に以下2つの値が重要)
    • statusListIndex
    • statusListCredential
  3. Issuer DIDのDID DocumentからIdentity HubのserviceEndpointを取得
  4. 2で取得したstatusListCredentilalからIdentity HubへPOSTすべきBodyを生成、Identity Hubへ投げ込む
  5. Identity HubからstatusList2021CredentialというTypeのVCが返ってくるのでencodedListを取得
  6. 2でとっておいたstatusListIndexでencodedListのオフセットを確認し、ビットが立っていたら取り消し済み、倒れていたら有効として判断

■実際に取得してみる

まずは、VCからCredentialStatusの取得です。これは単純にJWTをパースすればOKです。
{
  "vc": {
    "@context": [
      "https://www.w3.org/2018/credentials/v1"
    ],
    "type": [
      "VerifiableCredential",
      "hogehogeVC"
    ],
    "credentialSubject": {
      "name": "hoge taro",
      "mail": "hoge@exampple.jp"
    },
    "credentialStatus": {
      "id": "urn:uuid:6fa4e682-f427-41cf-b0e5-59179d66fea3?bit-index=5",
      "type": "RevocationList2021Status",
      "statusListIndex": 5,
      "statusListCredential": "did:web:example.jp?service=IdentityHub&queries=W3sibWV0aG9kIjoiQ29...(省略)...jZmZWEzIn1d"
    },
    (以下省略)


大事なのはstatusListIndex、statusListCredentialなかでもqueriesの値です。
queriesはbase64urlエンコードされたjsonなのでデコードすると後からIdentity Hubへ投げ込む値が出てきます。
[
	{
		"method": "CollectionsQuery",
		"schema": "https://w3id.org/vc-status-list-2021/v1",
		"objectId": "6fa4e682-f427-41cf-b0e5-59179d66fea3"
	}
]


では、このデータをIdentity Hubに投げ込んでいきます。
まずはIdentity Hubのエンドポイントを取得する必要があります。statusListCredentialを見ると当該のDIDのserviceの種類がIdentityHubとなっているところにqueriesの値を投げ込むべし、ということが書いてあり、MSの仕様ではIdentityHubへ聞きに行く必要があるということが指し示されているからです。
ということでIssuer DIDをResolveします。これまでもこのBlogで触れてきたuniversal resolverを使ってもいいですし、Microsoftが用意しているdiscoveryエンドポイントを使ってもいいでしょう。今回はMicrosoftのものを使いました。
https://discover.did.msidentity.com/1.0/identifiers/{IssuerのDID}
でGETするとDID Documentが返ってきます。
{
  "id": "did:web:example.jp",
  "@context": [
    "https://www.w3.org/ns/did/v1",
    {
      "@base": "did:web:example.jp"
    }
  ],
  "service": [
    {
      "id": "#linkeddomains",
      "type": "LinkedDomains",
      "serviceEndpoint": {
        "origins": [
          "https://example.jp/"
        ]
      }
    },
    {
      "id": "#hub",
      "type": "IdentityHub",
      "serviceEndpoint": {
        "instances": [
          "https://hub.did.msidentity.com/v1.0/{tenant id}"
        ]
      }
    }
  ],
  (以下省略)

この中のIdentityHubのserviceEndpointの値を取得します。Entra Verified IDの場合、https://hub.did.msidentity.com/v1.0/{Azure ADのテナントID}という構造になっていますので、あらかじめわかっている場合はわざわざresolveしなくてもいいかもしれません。

このエンドポイントに先ほど取得したqueriesの値を含むjsonをPOSTすることでstatusList2021Credentialが取得できます。

まずはPOSTデータの作成です。
構造としてはこんな感じになっています。
{
  "requestId": "c5784162-84af-4aab-aff5-f1f8438dfc33",
  "target": "did:web:example.jp",
  "messages": [
    {
      "descriptor": {
        "method": "CollectionsQuery",
        "schema": "https://w3id.org/vc-status-list-2021/v1",
        "objectId": "6fa4e682-f427-41cf-b0e5-59179d66fea3"
      }
    }
  ]
}

requestIdはuuid-v4形式の値を指定します。単なるリクエストとレスポンスを紐づけるための識別子なので値はなんでもOKです。
targetはissuerのDIDを指定します。
messagesの中のdescriptorに先ほど取得したqueriesの値をセットします。

ということでPOSTすると以下のレスポンスが返ってきます。
{
    "requestId": "c5784162-84af-4aab-aff5-f1f8438dfc33",
    "replies": [
        {
            "messageId": "bafkreicksslcxa7xraqg6luqqfsezkpfalpqdqk6jzealwqxrkv7svu5vy",
            "status": {
                "code": 200
            },
            "entries": [
                {
                    "descriptor": {
                        "method": "CollectionsWrite",
                        "schema": "https://w3id.org/vc-status-list-2021/v1",
                        "dataFormat": "application/vc+jwt",
                        "objectId": "6fa4e682-f427-41cf-b0e5-59179d66fea3",
                        "clock": 0,
                        "cid": "bafkreib5cnsi7kw5ya6otq2lybvwnqlh2ga2gmud7x7t46f4zkkcca6s5y"
                    },
                    "data": "ZXlKaGJHY2lPaUpG...(省略)...IydDNXaWhR"
                }
            ]
        }
    ]
}

大事なのはdataの部分です。
この値はbase64エンコードされたVerifiable CredentialsなのでデコードするといつものeyJ...が出てきます。もちろんこのjwtの署名検証はするとして、中身を確認していきます。
{
  "vc": {
    "@context": [
      "https://www.w3.org/2018/credentials/v1",
      "https://w3id.org/vc-status-list-2021/v1"
    ],
    "type": [
      "VerifiableCredential",
      "StatusList2021Credential"
    ],
    "credentialSubject": {
      "id": "urn:uuid:6fa4e682-f427-41cf-b0e5-59179d66fea3",
      "type": "RevocationList2021",
      "encodedList": "H4sIAAAAAAAAA-3BAQEAAAgCoPw_qmsOEfgcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAhAJmaUnkqGEAAA"
    }
  },
  "jti": "did:web:example.jp?service=IdentityHub&queries=W3sibWV0aG9kIjo3...(省略)...zlkNjZmZWEzIn1d",
  "iss": "did:web:example.jp",
  "sub": "urn:uuid:6fa4e682-f427-41cf-b0e5-59179d66fea3",
  "iat": 1667651604
}

大事なのはencodedListです。
この値はbase64でエンコードされgzipされたビット配列なのでデコードし、確認したいVCのstatusListIndexの値のオフセットの部分のビットの状態を確認します。

例えば、以下のような状態になっている場合は上から下に向けて1-2-4-8-...という形で桁が上がっていくのでこの例だと7番目だけがActive、あとは取り消し済みなのでencodedListは2進数でいうと「...110111111」という形で対応するIndexにあたるビットが立ちます。

ここまでわかればあとは簡単ですね。
statusListIndexに指定された値(上の例だと5)に該当するオフセットの部分をmaskしてANDをとれば当該ビットが立っているのかどうかがわかり、当該のVCの状態が把握できます。


ということで今回はStatus List 2021の仕様とMSの実装について触れました。
(実際はMSのAPIの中でよろしくやってくれるので自前でコードを書く必要はないんですけどね)






2022年11月3日木曜日

Auth0 labのVerifiable Credentialsを試してみる

こんにちは、富士榮です


これまで当BlogでもVerifiable Credentials周りは色々と触ってきましたが、今回はAuth0ラボで公開しているサービスを触ってみます。

こんな感じでCredentialを作れるサービスです。



参考)これまで触れてきたDID/Verifiable Credentials関係のポストの一部

※まぁ、古くはConsensysのuPortなんてのをガリガリ触っていた時期もあるんですが。。。


ということで一通り触ってみましょう。

注)その名の通りラボなのでプロダクションで使うのはやめましょう。

■Auth0ラボのセットアップ

まずはAuth0のラボ環境を作ります。通常のAuth0環境とはことなり、別のテナントを作る必要があります。


にアクセスするとログインが求められるのでアカウントを作るか、自前のAuth0のアカウントでログインしましょう。

■Verifiable Credentialsのテンプレートを作成

左側のナビゲーションメニューから[Credentials]をクリックするとTemplateを定義する画面が開きます。
適当にクレデンシャルの名前などを決めていきます。

一旦はここまでで、残りの見た目(Branding)などは後で設定します。

■Issuance Flowを定義

次はCredentialを発行する際の属性のマッピングなどを定義します。Microsoft Entraの場合はRulesで定義しましたが、Auth0の場合は[Actions]で定義します。
[Actions]から[Flows]を開くとテンプレートとしてVerifiable Credential Issuanceがあるので選択します。

カスタムで適当に属性のマッピングなどを定義します。この辺は当たり前ですがいつものAuth0です。
もちろん、ここで定義したapp_metadataはユーザの属性と一致させる必要がありますので、後でユーザを作成するときに属性を追加するのを忘れないようにします。

最終的にこんな感じにFlowが定義されていればOKです。

■DCRの有効化

Walletをクライアントとして登録する必要があるのですが初めからclient_idが払い出せるような世界じゃないのでDCR(Dynamic Client Registration)を有効にしておきます。
※テナント全体の設定に関わる話なので、慎重に

ナビゲーションから[Settings]、[Advanced]を開くと[OIDC Dynamic Application Registration]があるので有効にします。

■認証定義で3rd Party Clientsを有効化

3rd Party Clientsからの認証要求を有効化することでWalletの様に1st Partyではないアプリケーションからの認証要求に対応できる様にします。
これもいつもの[Authentication]から任意のConnection(今回は面倒なのでDatabase Connectionを使いました)を開き、設定内の[Enable for third party clients]を有効にします。

■ユーザの作成と属性の定義

先ほどFlowを定義した際にも述べましたが属性のマッピングを行うにはユーザに当該の属性がないといけません。
なので、ユーザを作成し、app_metadataに必要となる属性値を定義しておきます。
今回はこんな感じで定義しています。

■Credentialの定義を完成させる
最初にやってもよかったんですが、[Credentials]メニューから先ほど作成したTemplateの見た目の部分にあたる[Branding]を設定します。
と言ってもロゴや背景画像を指定するだけですが。

■いざ、発行

ここまでで設定はおしまいなので、発行してみましょう。
テスト用にブラウザで動くWalletが組み込まれているので、[Credentials]からTemplateを開いたところにある[Try Credential]をクリックするとすぐに使えます。

起動するとRequest Credentialボタンが出てくるのでクリックして発行を要求します。
ログインが求められますので、先ほど作成したユーザを使ってログインします。
属性提供に関する認可が走ります。

Credentialが表示されるので、Add CredentialでWalletにCredentialが格納されます。

■次は検証

CredentialがWalletに入ったら次は提示(Presentation)から検証ですね。
こちらもラボが用意されているので非常に簡単です。
Wallet内のCredentialをクリックすると[Try Presentation Flow]というボタンが出てくるのでクリックするだけです。
クリックするとテスト用のVerifierが起動してくるのでQRコードの下にある[Click here to continue]をクリックするとブラウザ版のWalletへPresentation Requestが行われます。
提示するCredentialを選択して[Present credential]をクリックします。

Verifiable Presentation/Credentialがテストサイトに渡されるので中身が見えます。



と、ここまでです。
非常に簡単です。


VPやVCを軽くみましたが、ld-proofなんですね。
Microsoft Authenticatorとの互換性は今のところなさそうです。もうちょいカスタマイズすれば色々とやれそうなので、引き続き触ってみようかと思います。
なんにせよ、こういう形で選択肢が増えてくるのは良いことですね!










2022年7月2日土曜日

分散型ID関係のコミュニティ立ち上げ

こんにちは、富士榮です。


5月末にMicrosoftからAzure Active Directory、CloudKnox Permissions Management、Azure AD Verifiable CredentialsをまとめたMicrosoft Entraが発表されたこともあり、先日のOffice365勉強会で分散型ID(DID/Decentralized Identifiers)、検証可能な資格情報(VC/Verifiable Credentials)に関するプレゼンをさせていただきました。

事前申し込みも400オーバー、当日も230名くらいの方にご参加いただき、slidoの質問やコメントも止まらない感じで時間を大幅に超えて23時くらいまでやらせていただくくらいには盛況だった様です。(みんなそんなにDIDとVCに興味あるのかな?)

また、そんな中、W3Cでは長らくFormal Objectionによるこう着状態が続いていたDID Core Specificationに決着がつきW3C勧告へ進むことが承認された、との発表がありました。

これでますます開発者の人たちは安心してこの技術領域へ突き進んでいけますね!


ということで、先の勉強会でも発表させていただいたのですが、DID/VCに興味のあるエンジニアの皆さんが集まる場が欲しいよね、ということでCollabogateの三井さんやBlockBaseの山村さんたちと「DID Developer Community(仮)」を立ち上げることにしました。


と言っても現時点ではDiscordの板が存在しているくらいなので、あまりコンテンツもありませんし、アクティブな活動も予定されているわけではありませんが、まずはここにエンジニアの皆さんには集まっていただき、なんでも情報交換ができる様な場所を作れればな、、と思います。

ということでぜひご参加ください。

https://discord.gg/nn53BRRz(招待リンクが切れていたので張り替えました)

https://discord.gg/UFE9m22TeT


あ、参考までに先の勉強会で使った資料も貼っておきます。