電子処方せん 基本的な構成
電子処方せんはXML文書であって「XAdES(XML Advanced Electronic Signatures)形式」の長期署名プロファイルで電子署名を施した文書形式です。
「XAdES」フォーマットは、ETSI TS 101 903で定義されたフォーマットです。
規格書だけでは具体的なイメージがなかなか掴めなかったのですが、ONSからサンプルが提供されましたので、早速それを解析してみました。なお、提供された文書を簡単な検証アプリをプラグラムして検証したところ問題なく検証できました。
署名対象
以下の図は署名対象を解析したものです。
3つのブロックを署名対象としています。
1、処方せんデータ
2、署名者の電子証明書
3、object要素内のSignedPropertes要素(署名者の情報や署名時刻が記録されている部分)
署名対象は<SignedInfo>要素の中にまとめられています。それぞれのブロックは指定された形式でダイジェスト化され、ハッシュ値が計算されてそれがブロックごとに記録されています。
どのブロックをどのように処理するかは、<xs:Reference>要素に記述されています。3つのブロックがあるので、<xs:Reference>要素も3つあります。ブロックの指定は<xs:Reference>タグの「URI」属性でIDを使って指定します。
<xs:Transforms>で正規化方法を<xs:DigestMethod>でダイジェストを求めるアルゴリズムを指定します。
ダイジェスト処理で得られたハッシュ値は<xs:DigestValue>に記述します。
電子署名
電子署名は、ハッシュが記録された「SignedInfo」要素を指定された形式に正規化し、指定された形式のハッシュを求め、それを署名者の秘密鍵で暗号化して「SignatureValue」要素内に記録します。
![Untitled-59 Untitled-59](https://karte-m.cocolog-nifty.com/free/images/untitled-59.png)
以上
歯科電子カルテシステム・カルテメーカー は利用料月額16,500円(税込)
MacとWinの両方で利用可能な電子カルテです。介護保険にも対応してます。
カルテメーカーの詳細はカルテメーカー・ホームページまで。
カルテメーカーを実際に動かしてみたいときは評価版をダウンロードできます。
| 固定リンク
「カルテメーカー」カテゴリの記事
- マイナ保険証による公費情報の取得について(PMHへの対応)(2024.11.28)
- 医療DX加算改定に伴う設定について(2024.10.01)
- 長期収載品の選定療養導入に伴なう処方入力の変更について(2024.09.29)
- 訪問診療でのオンライン資格確認方法(居宅同意取得型)(2024.06.11)
- カルテメーカーのペーパーレス運用について(2024.04.29)
「4D」カテゴリの記事
- 電子処方せん 基本的な構成(2022.08.25)
- 電子処方せん対応 4Dプラグイン開発(その3かな?)(2022.08.12)
- 電子処方せん対応 4Dプラグイン開発(2022.08.12)
- 忘れないうちにOpenSSLでの暗号化と復号 (その2)(2022.08.12)
- 電子処方箋対応 4Dプラグイン開発 pkcs#11、OpenSSL、電子署名、HPKIカード 導入備忘録(2022.08.09)
「電子処方せん」カテゴリの記事
- 電子処方せん 基本的な構成(2022.08.25)
- 電子処方せん対応 4Dプラグイン開発(その3かな?)(2022.08.12)
- 電子処方せん対応 4Dプラグイン開発(2022.08.12)
- 忘れないうちにOpenSSLでの暗号化と復号 (その2)(2022.08.12)
- 忘れないうちにOpenSSLでの暗号化と復号 (その1)(2022.08.12)
「電子署名」カテゴリの記事
- カルテメーカーのペーパーレス運用について(2024.04.29)
- 電子処方せん 基本的な構成(2022.08.25)
- 電子処方せん対応 4Dプラグイン開発(その3かな?)(2022.08.12)
- 電子処方せん対応 4Dプラグイン開発(2022.08.12)
- 忘れないうちにOpenSSLでの暗号化と復号 (その2)(2022.08.12)
「HPKIカード」カテゴリの記事
- 電子処方せん 基本的な構成(2022.08.25)
- 電子処方せん対応 4Dプラグイン開発(その3かな?)(2022.08.12)
- 電子処方せん対応 4Dプラグイン開発(2022.08.12)
- 忘れないうちにOpenSSLでの暗号化と復号 (その2)(2022.08.12)
- 忘れないうちにOpenSSLでの暗号化と復号 (その1)(2022.08.12)
コメント
初めてコメントさせていただきます。
いつも興味深く拝見させていただいています。
電子処方箋につきましては私も個人的にプログラミングできないか試行錯誤しているのですが
なかなかうまくいきません。
<xs:KeyInfo>の情報をsha-256でハッシュ化してDigestValueにセットしているのですが
「署名者証明書情報KeyInfoに対するReferenceのDigest値が一致しません。」
というエラーになります。
ハッシュの生成はどのようにされていますでしょうか。
ご教授いただければ幸いです。
投稿: H.NII | 2022年11月24日 (木) 19時23分
ハッシュの生成は一般的なOpenSSLです。でも、そのエラーはハッシュ処理ではなく、その前段階のXMLの正規化が正しく処理されていないのだと思います。<xs:Transforms>で指定した(通常はexc-c14n)で正規化されているか(あるいは指定しないで、処理されているか)を確認してください。
私の場合、exc-c14nの処理を、所持してるライブラリの中で見つけられなかったので、適当にでっちあげて処理しましたがなんとかなってます。
exc-c14nの規格は調べるとたくさんでてきますので詳細はそれを参照してください。
ざっくりいうと、exc-c14nは
改行をLFにする。スペース、タブはそのまま、切り出したXMLで使われている名前空間を先頭のタグで指定する。xs:Keyinfoであればxsの名前空間を指定(xmlns:xs="http://www~")しないといけません。
exc-c14nで正規化しない場合は、
改行、スペース、タグ等はそのまま、切り出したXMLを含んで、その前に出現した名前空間を先頭のタグで全て指定する、xs,xsi等を指定する。
です。
投稿: カルテメーカー | 2022年11月25日 (金) 10時32分
電子処方箋に取り組んでいる者ですが、資料が少なく貴殿のこのWebを大変参考にさせて頂いております。
教えて頂きたいことがあります。
最初のReferenceの<PrescriptionDocument>に対する。<xs:DigestValue>の部分ですが、
ONSからの提供サンプルで
<PrescriptionDocument>処方箋CSV(Base64後)</PrescriptionDocument>
を ファイル(PrescriptionDocument.xml)として保存し
下記コマンド
openssl dgst -binary -sha256 PrescriptionDocument.xml | openssl enc -e -base64
を実行するのですが、結果が、提供サンプルの<xs:DigestValue>と一致しない状況です。
<xs:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>をコマンドで表現するとどのようになるのでしょうか。
ご教授いただければ幸いです。
投稿: macpapa | 2023年1月29日 (日) 17時47分
ハマる部分ですねぇ。私もハマりました(^^;
1番目のご質問と同じものですね。
<PrescriptionDocument id="PrescriptionDocument">処方箋CSV(Base64後)</PrescriptionDocument>要素のダイジェストは、
<xs:SignedInfo>の<PrescriptionDocument>への参照<xs:Reference URI="#PrescriptionDocument">をみると<xs:Transforms>要素が存在しません。このため、<PrescriptionDocument>要素はダイジェストする前に「正規化しない」ことになります。
<PrescriptionDocument>要素を正規化しない場合は、<PrescriptionDocument>要素が出現する前に宣言された名前空間宣言を全てこのタグの中に含めないといけません。
<PrescriptionDocument>要素の前には、先頭で<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> とxmlns宣言があります。
ですので、ダイジェストをする前に
<PrescriptionDocument id="PrescriptionDocument">タグに名前宣言を追加して
<PrescriptionDocument id="PrescriptionDocument" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">としてから、ダイジェストを求めます。
ここで、もし<xs:Reference URI="#PrescriptionDocument">要素の中に<xs:Transforms>要素があって、アルゴリズムAlgorithm="http://www.w3.org/2001/10/xml-exc-c14n#"の正規化が指定されている場合は、排他的c14n正規化を施してからダイジェストを求めることになります。
<PrescriptionDocument id="PrescriptionDocument">要素を排他的c14n正規化する場合は、この要素に関連した名前空間宣言だけをすることになりますので、この場合は、タグにはなにも追加しないで、そのまま
<PrescriptionDocument id="PrescriptionDocument">
としてダイジェストを求めます。
この正規化するしないは、また、xml-exc-c14n正規化の方法は、ESIやW3Cのドキュメントを参照してください。
投稿: カルテメーカー | 2023年1月29日 (日) 20時44分
お返事ありがとうございます。属性追加が必要とは判りませんでした。
<PrescriptionDocument id="PrescriptionDocument" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">と属性追加して、前記コマンドを実行しましたが、まだ一致しません。
<PrescriptionDocument xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="PrescriptionDocument">としても、一致が得られませんでした。
もしその他にアドバイスをいただける事があれば、またお願い致します。
投稿: macpapa | 2023年1月30日 (月) 01時30分
こんにちは。初めてコメントさせて頂きます。私も個人的に電子処方箋の署名に関わっている者です。
当コメントのH.NIIさん、macpapaさんの問題と全く同じ問題で私もハマってしまって途方にくれていました。(当ページを見つける前も、見つけた後もハマりました。泣)
ハマった結果見つけた、当問題の答えはずばり下記です。
<PrescriptionDocument xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="PrescriptionDocument">(base64文字列)</PrescriptionDocument>
上記文字列をハッシュしたら一致しました。お試し下さい。
もし一致しない場合は、
・UTF-8であるか
・Base64文字列の前後に余分な空白がないか
・要素の前後に余分な空白がないか
などをチェックしてみて下さい。ご健闘を祈ります。
投稿: voyager | 2023年3月23日 (木) 15時03分
オンライン資格も含めいつもこのWebサイトを参考にさせていただいております。
貴重な情報を共有していただきありがとうございます。
ひとつ分からない事がありもしよろしければお知恵をいただきたいです。
それはタグ"KeyInfo"や"SignedProperties"等のId属性についてです。
こちらは固定の文字列のほかに8桁の値が振ってあるのですが何か特別なルール等があるのでしょうか。
資料等が見つからず途方に暮れております。
投稿: Uesugi | 2023年4月 3日 (月) 00時58分
もう解決済みなのかもしれませんが、また本来私がコメントすべきものではないのかも知れませんが、同じ問題に悩んだ者として判ってることを投稿させて頂きます。
医療機関等ONSに対して過去質問した中の一つに下記の返答がありました。
質問;<PrescriptionSign> 以下のタグにあるタグ名・タグ属性(IdやURI)は固定値で不変と考えていいのですか。
回答;設定値に関しては、記録条件仕様及び参照先の規格をご確認ください。要素構成については、ISO14533-2:2021を採用しています。<xs:Signature>要素のId属性は「PrescriptionSign」固定となります。その他のId属性に関しては、電子処方箋(調剤済み電子処方箋)XML内で一意に振られていれば問題ありません。
私のところで<xs:Signature>要素以外は、Idを記録せず送ってもエラーは帰ってきていません。(調剤の方は判りません。ONS側で一意になるよう追加されているかもしれません。) 一応、W3CのXAdES規格の記載にもIdはOptinalになっているようです。
<PrescriptionDocument>の件で、医療機関等ONSのサイトの中にもカルテメーカーと同様な解説がありました。
「第4回医療機関等ベンダー向け説明会で受け付けた質問への回答一覧.pdf」の#28 です。
投稿: macpapa | 2023年7月21日 (金) 12時39分
ネットを彷徨っていてたまたま発見しました。
なかなか内容が充実していますね。
感心しました。
ところで、当局が公開している「HPKIカードドライバ」が使いにくい、というかそもそも Mac 向けにリリースすらされてないので、結局、HPKI カードに APDU のコマンド送り込んで、秘密鍵で暗号化(署名)させてみました。
バイナリを公開、使い方を
https://github.com/Hiroaki-Inomata/HPKI-tools/issues/2
で案内しています。
投稿: 猪股弘明 | 2024年5月 4日 (土) 09時44分