chike0905の日記

何者かになりたい

did:webをGitHub Pagesで使う

本項はdid methodのdid:webGitHub Pagesでホストし,didを使った署名検証を行うメモである. didはさまざまなメソッドの実装があるが,中でもdid:webは,特定のURLでアクセスできる箇所にDID Documentを配置することで利用できる. 特定のURLでアクセス可能な静的なサイトをホストする方法として,GitHub Pagesがある. そこで,本稿では特定のリポジトリGithub PagesでDID Documentを提供し,DIDをインスタントに利用する方法を記す.

例によってdid:webの仕様は確定しておらず,2022年4月現在のものであることに留意していただきたい.

did:web仕様の理解

did:webの識別子は,did:webをmethodの識別子として,その後にdomain-nameが続く. 例えば,did:web:domain-nameのDIDがあった時,https://domain-name/.well-known/did.jsonでアクセスできるようにDID Documentを配置することで,resolverが解決可能になる. また,特定のドメイン配下の特定ユーザを表現するためには,domain-name:usernameなどと表現すると,https://domain-name/username/did.jsonがDID Documentの配置箇所になる. ドメイン配下のパスが入った場合.well-knownを実際のアクセスするパスに含まないので注意が必要である.

GitHub Pagesでのdid:webのホスト

GitHub Pagesは,特定のリポジトリの特定の箇所を,https://{GitHubUserName}.github.io/{RepositoryName}で静的にホストできる. 本稿では,この機能を使ってdid.jsonをアクセス可能にし,did:webを利用する. この時did:webはdid:web:{GitHubUserName}.github.io:{RepositoryName}となる.

筆者はhttps://{GitHubUserName}.github.ioで,自身のWebサイトchike.xyzをホストしているため,Github Pagesを利用するとhttps://chike.xyz/{RepositoryName}でホストされる. did:webの仕様と照らし合わせると,この場合のdid:webはdid:web:chike.xyz:{RepositoryName}となる.

GitHub Pagesでは,GitHub Pagesとしてホストする箇所は,gh-pagesブランチか,mainブランチのdocs以下を選択できる. そこで,Node.jsを用いてsecp256k1の鍵ペア及びDID Documentを生成し,それをmainブランチのdocs以下に配置するスクリプトを実装した.

github.com

詳細はリポジトリのREADMEに記載したが,本リポジトリをForkしてclone,src/config.json内にホストされるドメイン及びリポジトリ名を設定することで,鍵を1つ持つDID Documentをdocsディレクトリ内に生成できる. 生成したDID DocumentをGitHub上にpushし,GitHub上でGitHub Pagesとして,mainブランチのdocsをホストするよう設定することで,DID Documentを公開できる.

一応本リポジトリ内で生成した秘密鍵を用いてJWTを作成し,jwtのissuerとしてdidを利用して検証可能であるライブラリのdid-jwtを用いて検証可能なデモのスクリプトも設置している.

やってみての感想

GitHub Pagesは静的なサイトをホストするには非常に簡単で,使い勝手も悪くない. しかし,did:webをホストする,ということを考えるといくつかの懸念があると感じた. did:webの仕様上でも述べられているが,did:webはドメインの解決に強く依存しておりその解決が正常に行われるか,ということがdid:webを利用できる前提条件となる.

また,実質的に独自ドメインGitHub Pagesを用いた時は,DNSレコードとしてGitHubが指定する特定のA/AAAAレコードを設定することが求められる. 従って,ユーザがアクセス時にはVirtual Hostに相当するものでどのドメインが解決されアクセスしたかをGitHubが振り分けていると推測される. 本稿で述べた方式を用いてdid:webを利用すると,DNSが正しく解決されるかに加え,GitHubが正しくアクセスの振り分けを行うか,ということも懸念事項となる. DNS解決の真正性に関してはDNSSECの利用などが考えられるが,GitHub内部のプロセス依存の問題は外部からの検証が困難である.

一方,インスタントにdidを利用してみる,という点では,did:webとGitHub Pagesの組み合わせは非常に簡単であり1,利用しやすいため,暫定の実験目的などでは有効な1手段ではあると感じた.


  1. 実際Universal ResolverのExampleで用意されているdid:webはGithub Pagesでホストされているようである.