QA@IT

.net framwork4.0で電子署名を作成するときのURIエンコード

5294 PV

電子証明書情報を基にXMLファイルの電子署名を作成するプログラムを作成しています。

環境はasp.net(vb.net)でフレームワークは4.0です。

証明書情報をX509Storeから取得し、署名を付与するXMLファイルの特定のIDを持つノードに対して署名を付与します。
IDには日本語文字列が指定されており、SignedXMLクラスのComputeSignatureメソッドで署名情報を作成しているのですが、その際に、SignedInfoのReferenceには日本語文字列をURIエンコードした値をセットするように指示されています。

SignedXmクラスのAddReferenceメソッドでURIエンコードした値をセットすると、ComputeSignatureを実行するときに
「参照要素の形式が正しくありません」
というエラーになってしまいます。

以下、コードの抜粋です。

Dim element As String = "%e6%97%a5%e6%9c%ac%e8%aa%9e%e6%96%87%e5%ad%97%e5%88%97"

Dim env As New XmlDsigC14NTransform
reference.AddTransform(env)
signedXml.AddReference(reference)

signedXml.ComputeSignature()

SignedInfoのReferenceにURIエンコードした文字列をセットし、署名を行う方法はないでしょうか。

回答

自己レスです。

SignedXmlクラスをオーバーライドすることで解決しました。

編集 履歴 (0)

int32_tさん

すみません。コードに漏れと誤りがありました。
正しくは

Dim strUri As String = "#%e6%97%a5%e6%9c%ac%e8%aa%9e%e6%96%87%e5%ad%97%e5%88%97"

'変数reference
Dim reference As New Reference(strUri)

Dim env As New XmlDsigC14NTransform
reference.AddTransform(env)
signedXml.AddReference(reference)

signedXml.ComputeSignature()

になります。
日本語文字列をURIエンコードしたのち、先頭に#を付加しています。

しかし、エンコードした文字列では
「参照要素の形式が正しくありません」
というエラーになってしまいます。

日本語文字列のままであれば署名は付与できるのですが、相手先のシステムで日本語文字列をデコードして要素を検索するため、当然ながらまったく違う文字列になってしまうため、やはりエラーになってしまいます。

編集 履歴 (1)

肝心の「変数 reference が何なのか」が示されていません。
.net のことは存じませんが、XML Signature の仕様のとおりならば reference URI は URI ですから、ID名には # を付ける必要があります。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。