⚠️ これは 非公式の翻訳サイトです。DCMTK / OFFIS とは無関係です。正確な情報は 原文(https://support.dcmtk.org/docs/dcmsign.html) を参照してください。

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 (証明書の場合) openssl crl -hash -noout -in (CRL の場合)

.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.