前回、「市販モジュールで管理サーバーと交信」はできた。
自力ベンダーとしては、しかし、電子処方箋モジュールも自作したいところである。
と或る電子カルテメーカーに、問い合わせると
電子処方箋の取り扱いには、電子署名、ICカードのハンドリング等の技術が必須になりますので、 かなりハードルが高いです。
自分でできる範囲内のことを、やることにする。
目標
- ES型式の署名付き医師処方箋発行を目指す。調剤処方箋とか、ES-XLとかは一切触らない。
使用言語
- C#:Base64エンコード、exc-c14n正規化、SHA256hash計算はできそう。
電子署名、ICカードのハンドリング
APDU Handling
-
HPKIカードで署名してみる は、APDUコマンドを直接カードに送り込んでいる。この手法は大部であるし、もっとオサレな方法はないのか?と調査したところ、、
High-Level API
-
電子署名に使えるHigh-LevelAPIがあると判明。
PKCS#11 CNG/CryptoAPI Cross-Platoform Yes No(Windows-only) Direct Token Aceess Yes Indirece(via middleware) Eas of Use Moderate High Dependency Vendor’s PKCS#11 library Windows CSP/KSP ☞ HPKIドライバーは提供されているので、PKCS#11でいく。
- BouncyCastle:有名なライブラリだが、直接スマートカードにアクセスはできない。スマートカードをPCに接続しHPKI driverをインストールすれば、証明書ストアに公開鍵関連データが保存される。そのストアにアクセスする仕様。従って、証明書取り出しと検証(←公開鍵要、秘密鍵不要)は可能で、そこに関してはPKCS#11系でやるより美しく書ける。
- 以上より、署名はPKCS#11で、証明書取り出しと検証はBouncyCastleを使う。
xmlの仕様
取り寄せた市販モジュールの出力xml、OSNに掲載されてる各社の電子処方箋xmlを諸所比較すると、結構違いがある。
- xmlの名前空間:xsかdsか。
ds: | xs: | |
Namespace URI | http://www.w3.org/2000/09/xmldsig# | http://www.w3.org/2000/09/xmldsig# |
Primary Usage | Digital signatures | XML Schema definitions |
Scope | Ensures security (signatures, keys) | Defines structure and data types |
Common Context | Security-related XML documents | XML Schema files or validation rules |
xsを使ってる例のほうが多いようだが、XAdES(XML Advanced Electronic Signatures) 型式なんだから、dsのほうが良いんじゃね? 仕様書もdsつかってるみたいだし。
- PrescriptionDcoumentをexc-c14nで正規化するかどうか。
正規化してもしなくてもいいようで、正規化しない例のほうが多い。
ただ、KeyInfoとSignedPropertiesは正規化必須なので、PrescriptionDcoumentも正規化するほうが整うと感じる。
- IssurerSerialをどうするか
いれてない例もあるし、入れててもIssuerNameとSerialNumberを別々に載せている場合、IssuerNameとSerialNumberをくっつけるSigningCertificateV2を採用してる場合がある。
SigningCertificateV2に移行するらしいので、これを使う。
完成したやつ
- HPKISigner.exe “入力csvのパス” “出力xmlのパス” PIN
- .net8.0なのでwin-64のみならず、linux・mac・mac-armとCross-platform(のはず)
- 今一、全く自信ないので、いつでも市販モジュールと交換できるようにしてる。
- Github に載せました。
これで、一安心の一歩手前。しかし、肝心の本番カードは未入手である。。
2025/2/18追記
セカンドHPKIは「xs:を使っており、PrescriptionDcoumentはexc-c14nで正規化しておらず、IssurerSerialは加えず」