dcmsign: DICOM ファイルへの署名と検証
書式
dcmsign [options] dcmfile-in [dcmfile-out]
説明
dcmsign は DICOM ファイル(dcmfile-in)を読み込み、デジタル署名に関する操作を行い、何らかの変更が発生した場合は DICOM オブジェクトを出力ファイル(dcmfile-out)へ書き出します。
サポートするデジタル署名操作は次の5種類です。
- DICOM ファイル内のすべての署名の検証
- メインデータセットへの新しいデジタル署名の作成
- データセット内に埋め込まれたシーケンスのアイテムへの新しいデジタル署名の作成
- DICOM ファイルからの単一のデジタル署名の削除
- DICOM ファイルからのすべてのデジタル署名の削除
引数
dcmfile-in DICOM input filename to be processed ("-" for stdin)
dcmfile-out DICOM output filename ("-" for stdout)
オプション
全般オプション
-h --help- このヘルプを表示して終了します
--version- バージョン情報を表示して終了します
--arguments- 展開後のコマンドライン引数を表示します
-q --quiet- quiet モード。警告やエラーを表示しません
-v --verbose- 詳細表示モード。処理の詳細を表示します
-d --debug- debug モード。デバッグ情報を表示します
-ll --log-level [l]evel: string constant- (fatal, error, warn, info, debug, trace) ロガーにレベル l を使用します
-lc --log-config [f]ilename: string- ロガーに設定ファイル f を使用します
入力オプション
+f --read-file- ファイル形式またはデータセットを読み込みます(既定値)
+fo --read-file-only- ファイル形式のみを読み込みます
-f --read-dataset- ファイルメタ情報なしでデータセットを読み込みます。入力転送構文:
-t= --read-xfer-auto- TS の自動認識を使用します(既定値)
-td --read-xfer-detect- ファイルメタヘッダで指定された TS を無視します
-te --read-xfer-little- explicit VR リトルエンディアン TS で読み込みます
-tb --read-xfer-big- explicit VR ビッグエンディアン TS で読み込みます
-ti --read-xfer-implicit- implicit VR リトルエンディアン TS で読み込みます。長さ指定された UN 要素の扱い:
-uc --retain-un- 要素を UN のまま保持します(既定値)
+uc --convert-un- 既知であれば実際の VR に変換します
署名コマンド
--verify- すべての署名を検証します(既定値)
+s --sign [p]rivate key file, [c]ertificate file: string- メインオブジェクトに署名を作成します
+si --sign-item [k]eyfile, [c]ertfile, [i]tem location: string- シーケンスアイテムに署名を作成します
+t --insert-timestamp ts[q]file, ts[r]file [u]idfile: string- タイムスタンプクエリ q に対するタイムスタンプレスポンス r から認証タイムスタンプを取り出し、署名 UID u に挿入します
+r --remove [s]ignature UID: string- 署名を削除します
+ra --remove-all- データセットからすべての署名を削除します
全般署名オプション
-pem --pem-keys- 鍵・証明書を PEM ファイルとして読み込みます(既定値)
-der --der-keys- 鍵・証明書を DER ファイルとして読み込みます。署名形式:
-fn --format-new- 正しい DICOM 署名形式を使用します(既定値)
-fo --format-old- 旧来(3.5.4 以前)の DCMTK 署名形式を使用します。署名が圧縮されたピクセルデータを含む場合は規格非準拠となります。このオプションは旧形式の署名を検証する場合にのみ使用すべきです。
署名検証オプション(--verify 時のみ)
+rv --verify-if-present- 署名が存在すれば検証し、なければそのまま通過します(既定値)
+rg --require-sig- 署名が1つも存在しない場合は失敗とします
+rc --require-creator- creator RSA 署名が存在しない場合は失敗とします
+ru --require-auth- auth RSA 署名が存在しない場合は失敗とします
+rs --require-sr- SR RSA 署名が存在しない場合は失敗とします。タイムスタンプ検証:
+tv --verify-ts- 認証タイムスタンプが存在すれば検証します(既定値)
-tv --ignore-ts- 認証タイムスタンプを無視します
+tr --require-ts- 認証タイムスタンプが存在しない場合は失敗とします。認証局:
+cf --add-cert-file- [f]ilename: string 信頼する証明書ファイルを証明書ストアに追加します
+uf --add-ucert-file- [f]ilename: string 信頼しない中間証明書ファイルを追加します
+cd --add-cert-dir- [d]irectory: string ディレクトリ d 内の証明書を証明書ストアに追加します
+cr --add-crl-file- [f]ilename: string 証明書失効リストファイルを追加します(--enable-crl-vfy を含意する)
+cl --enable-crl-vfy- 証明書失効リストの検証を有効にします
署名作成オプション(--sign または --sign-item 時のみ)
+ps --std-passwd- 標準入力からパスワードの入力を求めます(既定値)
+pw --use-passwd [p]assword: string- 指定したパスワードを使用します
-pw --null-passwd- パスワードに空文字列を使用します。デジタル署名プロファイル:
-pf --profile-none- 署名プロファイルを一切強制しません(既定値)
+pb --profile-base- base RSA 署名プロファイルを強制します
+pc --profile-creator- creator RSA 署名プロファイルを強制します
+pa --profile-auth- authorization 署名プロファイルを強制します
+pr --profile-sr- SR RSA 署名プロファイルを強制します
+pv --profile-srv- SR RSA 署名プロファイル(検証)を強制します。MAC アルゴリズム:
+mr --mac-ripemd160- RIPEMD 160 を使用します(既定値)
+ms --mac-sha1- SHA-1 を使用します
+mm --mac-md5- MD 5 を使用します
+m2 --mac-sha256- SHA-256 を使用します
+m3 --mac-sha384- SHA-384 を使用します
+m5 --mac-sha512- SHA-512 を使用します。署名目的:
+lp --list-purposes- 署名目的コードの一覧を表示して終了します
-sp --no-sig-purpose- 署名目的を付加しません(既定値)
+sp --sig-purpose- [p]urpose code: integer (1..18) デジタル署名目的コード p を付加します。タグ選択:
-t --tag- [t]ag: "gggg,eeee" または辞書名 指定したタグのみに署名します(このオプションは複数回指定できます)
-tf --tag-file [f]ilename: string- テキストファイルからタグの一覧を読み込みます
タイムスタンプ作成オプション(--sign または --sign-item 時のみ)
-ts --timestamp-off- タイムスタンプを作成しません(既定値)
+ts --timestamp-file [t]sq-filename, [u]id-filename: string- タイムスタンプクエリファイル t と uid ファイル u を作成します。タイムスタンプ MAC アルゴリズム(--timestamp-file 時のみ):
+tm2 --ts-mac-sha256- SHA-256 を使用します(既定値)
+tm3 --ts-mac-sha384- SHA-384 を使用します
+tm5 --ts-mac-sha512- SHA-512 を使用します
+tmr --ts-mac-ripemd160- RIPEMD 160 を使用します
+tms --ts-mac-sha1- SHA-1 を使用します(非推奨)
+tmm --ts-mac-md5- MD5 を使用します(非推奨)。タイムスタンプクエリの nonce オプション(--timestamp-file 時のみ):
+tn --ts-use-nonce- ランダムな nonce を含めます(既定値)
-tn --ts-no-nonce- nonce を含めません。タイムスタンプの証明書同梱オプション(--timestamp-file 時のみ):
+tc --ts-request-cert- タイムスタンプ内に TSA 証明書を要求します(既定値)
-tc --ts-no-cert- TSA 証明書を要求しません。タイムスタンプのポリシーオプション(--timestamp-file 時のみ):
-tp --ts-no-policy- ts ポリシーを指定しません(既定値)
+tp --ts-policy [p]olicy-OID: string- タイムスタンプポリシー p を要求します
出力オプション
+t= --write-xfer-same- 入力と同じ TS で書き出します(既定値)
+te --write-xfer-little- explicit VR リトルエンディアン TS で書き出します
+tb --write-xfer-big- explicit VR ビッグエンディアン TS で書き出します
+ti --write-xfer-implicit- implicit VR リトルエンディアン TS で書き出します。シーケンスとアイテムの長さエンコード:
+e --length-explicit- explicit な長さで書き出します(既定値)
-e --length-undefined- undefined な長さで書き出します。その他の出力オプション:
+d --dump [f]ilename: string- MAC コーデックに渡されるバイトストリームをファイルにダンプします(--sign または --sign-item 時のみ)
注記
ファイルと引数
dcmsign が読み書きするファイルとファイル形式について、本節で説明します。
公開鍵証明書は X.509v3 形式で、PEM または DER エンコーディングのいずれかであることを前提とします。dcmsign は現在 RSA と DSA の公開鍵をサポートしますが、DICOM 規格のセキュリティプロファイルで定義されているのは RSA 鍵のみです。
秘密鍵は PEM または DER エンコーディングを前提とします。PEM は秘密鍵を暗号化した形で保持できるため、推奨(かつ既定)です。暗号化された PEM 鍵を開く際の dcmsign の挙動はコマンドラインオプションで制御します(前述参照)。一般に、コマンドラインは "ps -ef" などでシステム上の他のプロセスから見えてしまう可能性があるため、暗号化パスワードをコマンドラインで指定することは推奨されません。
既定では、dcmsign はデータセットまたはアイテム内のすべてのデータ要素を対象とする署名を作成します。この既定の動作は、データ要素(属性タグ)の一覧を明示的に指定することで上書きできます。この一覧はファイルから読み込むか、コマンドラインで指定するか、あるいはその両方を行えます(両方の場合、属性タグは結合されます)。
コマンドラインでは、属性タグを次のように指定します。
--tag "gggg,eeee" where gggg and eeee are the hexadecimal group- gggg と eeee は16進のグループ番号と要素番号
--tag "Name" where 'Name' is a symbolic attribute name from- 'Name' は DICOM 辞書のシンボリックな属性名(後述)
–tag-file オプションでファイルからタグを読み込む場合は、プレーンテキストファイルを前提とします。ファイル内のタグは、データ辞書のシンボリックな名前か、(gggg,eeee) 形式(丸括弧付き)のいずれかです。タグは1つ以上の空白文字で区切ります。
現在選択されているデジタル署名プロファイルが、署名に含めるべき追加の属性タグを指定することがあります。その場合、それらは暗黙のうちに追加されます。
–sign-item 操作では、署名をどのシーケンスアイテムに作成するかを記述するロケーション文字列が必要です。ロケーション文字列の形式は次のとおりです。
SequenceName[index].SequenceName[index].SequenceName[index](...)
ここで SequenceName はデータ辞書のシンボリックな属性名か (gggg,eeee) 形式の数値タグのいずれかであり、index はアイテム番号を表す符号なし10進整数で、シーケンスの最初のアイテムをゼロとして始まります。例として、次のロケーション文字列
ReferencedSeriesSequence[0].ReferencedImageSequence[1]
は、メイン DICOM データセット内にある ReferencedSeriesSequence (0008,1115) の最初のアイテム内にある ReferencedImageSequence (0008,1140) の2番目のアイテムにデジタル署名を作成します。
認証タイムスタンプ
リリース 3.6.6 以降、dcmsign は RFC 3161 に準拠した認証タイムスタンプをサポートします。現時点では、タイムスタンプ局(TSA)と通信するために RFC 3161 で定義されたネットワークプロトコルは実装していませんが、署名作成時にタイムスタンプクエリ(TSQ)を書き出すことができ、新しいコマンド –insert-timestamp はファイルからタイムスタンプレスポンス(TSR)を読み込み、それを DICOM デジタル署名に追加します。DICOM ファイルには複数の署名を含められるため、TSR を追加すべき署名を識別するために「UID ファイル」(デジタル署名 UID を格納する)を使用します。dcmsign はタイムスタンプを保存する前に各種の整合性チェックも行います。
署名検証時には認証タイムスタンプの有無を検出し、–ignore-ts オプションが使われていない限りタイムスタンプも検証します。署名検証とタイムスタンプ検証は、DICOM 署名とタイムスタンプの証明書を確認するために共通の証明書ストアを使用します。このストアは、いずれも信頼する CA 証明書を追加する –add-cert-file と –add-cert-dir、信頼しない中間 CA 証明書を追加する –add-ucert-file、証明書失効リストを追加する –add-crl-file の各オプションで構築できます。
ハッシュ化された証明書ディレクトリ
–add-cert-file や –add-crl-file を使って CA 証明書や証明書失効リスト(CRL)を手動で追加する代わりに、–add-cert-dir を使って dcmsign が必要に応じて証明書や CRL を探索・読み込むディレクトリを用意することもできます。
このディレクトリには、1ファイルにつき証明書または CRL を1つ、PEM 形式で配置します。ファイル名は証明書なら hash.N、CRL なら hash.rN の形式とします。hash は次のコマンドで返される値です。
openssl x509 -hash -noout -in
.N または .rN というサフィックスはゼロから始まる連番であり、同じハッシュ値を持つ証明書または CRL ごとに連続して増加します。連番に欠番があってはなりません。連番の最初の欠番より先には、同じハッシュを持つオブジェクトはもう存在しないものとみなされます。
CRL は –enable-crl-vfy オプションが指定された場合にのみ検証されます。この場合、dcmsign は各 CA に対して CRL が存在することを期待し、署名者証明書を発行した CA の CRL が見つからない場合は署名検証を失敗とします。
ロギング
各種コマンドラインツールとその基盤ライブラリのログ出力レベルは、ユーザーが指定できます。既定では、エラーと警告のみが標準エラー出力に書き出されます。–verbose オプションを使うと、処理の詳細などの情報メッセージも報告されます。–debug オプションを使うと、内部動作のより詳細な情報を得られます(デバッグ目的など)。その他のログレベルは –log-level オプションで選択できます。–quiet モードでは致命的エラーのみが報告されます。このような非常に重大なエラー事象では、通常アプリケーションは終了します。各ログレベルの詳細については、モジュール "oflog" のドキュメントを参照してください。
ログ出力をファイルに書き出す場合(任意でログファイルのローテーションも可能)、syslog(Unix)またはイベントログ(Windows)に書き出す場合は、–log-config オプションを使用できます。この設定ファイルでは、特定のメッセージのみを特定の出力ストリームに振り分けたり、生成元のモジュールやアプリケーションに基づいて特定のメッセージをフィルタリングしたりすることもできます。設定ファイルの例は < etcdir>/logger.cfg に用意されています。
コマンドライン
すべてのコマンドラインツールは、引数について次の表記を用います。角括弧は省略可能な値(0〜1個)を囲み、末尾の3つのドットは複数の値が許されること(1〜n個)を示し、両者を組み合わせると0〜n個の値を意味します。
コマンドラインオプションは、先頭の '+' または '-' 記号によって引数と区別されます。通常、コマンドラインオプションの順序と位置は任意です(つまりどこに現れてもよい)。ただし、相互に排他的なオプションの場合は、最も右に現れたものが使用されます。この挙動は一般的な Unix シェルの標準的な評価規則に従います。
さらに、ファイル名の前に '@' 記号を付けることで、1つ以上のコマンドファイルを指定できます(例: @command.txt)。このようなコマンド引数は、それ以降の評価に先立ち、対応するテキストファイルの内容に置き換えられます(複数の空白は、引用符で囲まれていない限り単一の区切りとして扱われます)。なお、コマンドファイルの中に別のコマンドファイルを含めることはできません。この単純ながら効果的な仕組みにより、よく使うオプションや引数の組み合わせをまとめられ、長く分かりにくいコマンドラインを避けられます(例は < datadir>/dumppat.txt に用意されています)。
終了コード
dcmsign は終了時に次の終了コードを使用します。これにより、アプリケーションが終了した理由をユーザーが確認できます。
全般
EXITCODE_NO_ERROR 0
EXITCODE_COMMANDLINE_SYNTAX_ERROR 1
EXITCODE_NOOPENSSL 5
入力ファイルエラー
EXITCODE_CANNOT_READ_INPUT_FILE 20
EXITCODE_NO_INPUT_FILES 21
EXITCODE_CANNOT_READ_TAG_FILE 30
EXITCODE_CANNOT_READ_TSQ_FILE 31
EXITCODE_CANNOT_READ_TSR_FILE 32
EXITCODE_CANNOT_READ_UID_FILE 33
出力ファイルエラー
EXITCODE_CANNOT_WRITE_OUTPUT_FILE 40
EXITCODE_CANNOT_WRITE_SUPPORT_FILE 46
処理エラー
EXITCODE_CANNOT_ACCESS_SIGNATURE 80
EXITCODE_CANNOT_ACCESS_TS 81
EXITCODE_CANNOT_INSERT_TS 82
EXITCODE_SIGNATURE_REMOVAL_FAILED 83
EXITCODE_SIGNATURE_UID_NOT_FOUND 84
EXITCODE_SIGNATURE_CREATION_FAILED 85
EXITCODE_SYNTAX_ERROR_IN_TAG_FILE 86
EXITCODE_TS_CONSISTENCY_CHECK_FAILED 87
アプリケーション固有のエラー
EXITCODE_NO_SIGNATURES_PRESENT 100
EXITCODE_SIGNATURE_VERIFICATION_FAILED 101
EXITCODE_SIGNATURE_VERIFICATION_POLICY 102
環境変数
dcmsign は、DCMDICTPATH 環境変数で指定された DICOM データ辞書の読み込みを試みます。既定では、つまり DCMDICTPATH 環境変数が設定されていない場合は、辞書がアプリケーションに組み込まれていない限り(Windows では既定で組み込み)、ファイル < datadir>/dicom.dic が読み込まれます。
通常はこの既定の動作が望ましく、DCMDICTPATH 環境変数は別のデータ辞書が必要な場合にのみ使用すべきです。DCMDICTPATH 環境変数は Unix シェルの PATH 変数と同じ形式で、コロン(":")でエントリを区切ります。Windows システムではセミコロン(";")を区切りに用います。データ辞書のコードは DCMDICTPATH 環境変数で指定された各ファイルの読み込みを試みます。データ辞書が1つも読み込めない場合はエラーとなります。
著作権
Copyright (C) 2000-2025 by OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germany.