did:webをGitHub Pagesで使う
本項はdid methodのdid:webをGitHub 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
以下に配置するスクリプトを実装した.
詳細はリポジトリの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手段ではあると感じた.
-
実際Universal ResolverのExampleで用意されているdid:webはGithub Pagesでホストされているようである.↩