前回までで、HPKIカードの電子署名モジュールは自作できた。
が、本番カードが来ないので、セカンド証明書を使うしかない。
そして、その症例報告は皆無である。
緒言
- 物理HPKI証明書の知識は不要。☞ サーバーが署名してローカルにxmlを返却する仕組み。
- ローカルマシンと管理サーバー間のHandshakeが、分かりにくい。
ローカルマシンとサーバー間のHandshake
- 本態はOAuth2.0+OpenIDである。リモート署名クライアントアダプターインストール手順 によると
初見時の感想は「よう分からんナ~。分からんものを、使う気にならん~」
そこで、「雰囲気で使わずきちんと理解する!整理してOAuth2.0を使う」を読んで、ブラウザー挙動から動きを探った。
(FIDO認証を想定、用語はOAuth2.0とOpenIDで異なるが、OAuth2.0用語に統一)
セカンド証明書署名ライブラリー
物理カードモジュールとは異なり、多業者が参入しているわけではない。
現状 HPKIセカンド証明書リモート署名ライブラリ一式Ver2.10 一択。
提供ライブラリーには、
- ExamplePublisherClient.exe
- RemoteSignatureClientAdapter.exe
- RemoteSignatureClientService.exe
が含まれている。
うち、ソース提供があるのは 1.ExamplePublisherClient のみ。
2.3.は完全にブラックボックスで、リバースエンジニアリング厳禁とある。
その役割分担を推察する。
- RemoteSignatureClientAdapter.exeは、ポート番号3000を待ち受けするサービス。タスクスケジューラに登録する。
- RemoteSignatureClientService.exeは、ポート番号5000を待ち受けするサービス。タスクスケジューラに登録する。
- 上記ポートのリスニングは1.の起動時に走るNode.jsサーバーが担当する。
- ExamplePublisherClient.exeは「OAuth2.0+PKCE+OpenID+スマホ認証」のHandshake図で記した煩雑なトークン処理をRemoteSignatureClientAdapterに投げる。🔹 KeyCloakで「生体認証」が完了。
- 4.で受け取ったIDトークン+「HPKIセカンド電子証明書管理サービスクライアント証明書」を、(WebAPI選択の場合は)RemoteSignatureClientService経由で管理サーバーに渡す。🔹 「生体認証」+「所有認証」が完了。
- 5までが成功すると、管理サーバー上の「HPKI セカンド電子証明書」を使う権利が生じ、PrescriptionDocumentのハッシュ値を管理サーバーに送付する。管理サーバーはこのPrescriptionDocumentのハッシュ値と、管理サーバーがもつKeyinfo要素とSignedProtperties要素を、管理サーバー上の「HPKI セカンド電子証明書」の秘密鍵で署名しPrescriptionSign要素としてJSONで返してくる。
- ローカルでPrescriptionDocument要素を作って、6.のPrescriptionSign要素を付加して、電子署名付き処方箋.xmlが完成。
大枠、こういう流れになってると思う。
結語
- RemoteSignatureClientAdapterとRemoteSignatureClientServiceの相当物をスクラッチから作るのは、できなくはなかろうがかなりの難題であり、かつ、セキュリティホールができるだろう。MedisがFindexに委託したのもこの所以かもしれん。
- ExamplePublischerClient.exeは、WebAPIを選択すると、署名APIUrlの5000ポート、つまり、RemoteSignatureClientServiceを使う。一方、ライブラリを選択すると、直接管理サーバーの署名APIをたたいているようにみえる。つまり、RemoteSignatureClientServiceを使わないようだが、うまく動かない。
- 2のWebAPI利用なら、セカンド証明書電子署名モジュールは自作できる。著作権は「一般財団法人 医療情報システム開発センター」および「株式会社ファインデックス」帰属なので、Github公開できないがC#erなら楽勝。
この一連のサービスは遠からず、有料化されるらしい。
有料化されるまでに、本番カード届くのかナ?!