3

私は制御できない Java Web サービス用の WCF クライアントを作成していますが、Timestamp ヘッダー要素が署名されている場合にサービスが InvalidSecurity フォールトを返すという問題が発生しました。

私は現在、次を使用していますSecurityBindingElementが、これにより Timestamp 要素が自動的に署名されます。どうすればこの動作を停止できますか? より一般的には、署名されている要素と署名されていない要素をどのように制御できますか?

var version = MessageSecurityVersion.WSSecurity10WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10;
var sec = (AsymmetricSecurityBindingElement)SecurityBindingElement.CreateMutualCertificateBindingElement(version);
sec.EndpointSupportingTokenParameters.Signed.Add(new UserNameSecurityTokenParameters());
sec.MessageSecurityVersion = version;
sec.IncludeTimestamp = true;
sec.MessageProtectionOrder = MessageProtectionOrder.EncryptBeforeSign;
4

3 に答える 3

1

一般に、カスタム エンドポイント ビヘイビアーを実装し、AddBindingParameters() で次のようにすることで、どの要素が署名されるかを制御できます。

ChannelProtectionRequirements requirements = bindingParameters.Find<ChannelProtectionRequirements>();
requirements.IncomingSignatureParts...

ただし、この API の要素を削除する方法がわかりません。一部を追加するだけです。プライベートリフレクションでこれをハッキングできるかもしれません。

また、これがセキュリティのために機能するかどうかはわかりません。あなたの唯一の方法は、「includeTimestamp」をfalseに設定することだと思います。その場合、クライアントにタイムスタンプを送信しません。タイムスタンプ (署名なし) を送信する必要がある場合でも、false のままにし、カスタム エンコーダーを介して自分でタイムスタンプを作成します。難しくないはずです。署名されている場合は、メッセージ内の他のものを変更しないように注意してください。

于 2012-05-02T15:37:47.690 に答える
1

ヘッダーの各要素は [MessageHeader] でタグ付けできます。これにより、保護レベルを設定できます。

于 2012-05-01T09:52:32.967 に答える
0

答えに投票することはできませんが、クリスの提案はうまくいきました。本文に署名しないようにしたかった (したがって、署名された応答本文を期待する)。インターフェイスに移動し、MessageContracts の MessageBody 属性のすべてのインスタンスに ProtectionLevel=None を追加しました。どの部分も署名する必要がないため、WCF は要求本文への署名をスキップし、応答本文が署名されることも想定していません。それはまだ私のヘッダーフィールドに署名しています。

于 2012-08-24T10:49:48.183 に答える