5

編集:

最終的に、IClientMessageInspector はメッセージの署名を反映していないようであると判断したため、リクエストで実際に署名を取得していたときに、それを知りませんでした。それでは、私の新しい、本当の質問について...

SSL クライアント証明書を提示し、SOAP ヘッダーに署名するように WCF クライアントを構成するにはどうすればよいですか?

var myBinding = new BasicHttpBinding();
myBinding.Security.Mode = BasicHttpSecurityMode.TransportWithMessageCredential;
myBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
myBinding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.Certificate;

これにより、署名されたタイムスタンプを持つヘッダーが作成されます。ただし、クライアント証明書は提示されなくなり、SSL を通過できません。2行目を次のように変更すると:

myBinding.Security.Mode = BasicHttpSecurityMode.Transport;

次に、SSL を通過しますが、SOAP ヘッダーに署名ブロックがなくなりました。

SSL クライアント証明書を手動でアタッチできるように、HttpWebRequest を取得する方法はありますか?

webRequest.ClientCertificates.Add(certLoader.Load(@"c:\somecert.pfx"));

元の質問

アクセスを保護するために Forum Sentry ネットワーク アプライアンスを使用しているサード パーティが提供するサービスと相互運用する必要がある WCF クライアントに取り組んでいます。トランスポート レベルでのクライアント証明書を使用した SSL と、ヘッダーで証明書を使用した署名付きの o:Security 要素が必要です。標準バインディングでどちらか一方を達成することはできますが、両方を同時に実現することはできないようです。理想的には、メッセージが SSL クライアント証明書とは異なる証明書で署名されることを望んでいますが、SSL クライアント認証とメッセージの署名の両方に同じ証明書を使用できると彼らは言いました。

この時点で、必要に応じて CustomBinding を使用するなど、これを機能させるために何でもするつもりです。

以下を使用して SSL 部分を機能させることができます。

var myBinding = new BasicHttpBinding();
myBinding.Security.Mode = BasicHttpSecurityMode.Transport;
myBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
var url = "https://blah.com/services/somservice";
EndpointAddress ea = new EndpointAddress(url);
var client = new SoapClient(myBinding, ea);
var certLoader = new CertificateLoader("password");
client.ClientCredentials.ClientCertificate.Certificate = certLoader.Load(@"c:\somecert.pfx");
var resp = client.somemethod(ref profile, new RequestType { version = RequestTypeVersion.Item100 });
4

3 に答える 3

2

動作する石鹸のサンプルを公開してください (たとえば、ベンダーが提供するもの)。ところで、カスタムバインディングを使用するよりもはるかに抜本的な動きがあります:)

編集: トランスポート セキュリティとメッセージ セキュリティの両方を使用するには、カスタム バインドが必要です。これを自動的に行うための「wcfバインディングコンバーター」のGoogle。カスタム バインディングで、http 要素の代わりに https に変更し、属性 requirevlientcertificate を使用します。つづりを申し訳ありませんが、私はモバイルにいます

編集:

var c = new CustomBinding();            
MessageSecurityVersion version = MessageSecurityVersion.WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10;
var sec = SecurityBindingElement.CreateCertificateOverTransportBindingElement(version);
c.Elements.Add(sec);
c.Element.Add(new TextMessageEncodingBindingElement() { MessageVersion = MessageVersion.Soap11 };)
c.Elements.Add(new HttpsTransportBindingElement() { RequireClientCertificate = true });
于 2012-05-21T17:41:03.073 に答える
0

これは醜いですが、仕事を成し遂げます。デバッガーでこれらのカスタム バインディングのそれぞれの要素を見ると、両方ともスタックの一番下に HttpsTransportBindingElement がありますが、TransportWithMessageCredential インスタンスでは RequireClientCertificate が false に設定され、他のいくつかのプライベート メンバーが設定されていることがわかります。 false に設定された証明書に関連しています。Transport インスタンスでは、これらのメンバーが true に設定されます。これは明らかに WCF、IMO のバグです。

以下のコードは、customTransportSecurityBinding から「適切な」HttpsTransportBindingElement を取得し、customMessageCredentialBinding の「不適切な」ものを置き換えます。次に、変更した customMessageCredentialBinding をクライアント コンストラクターに渡します。

    var transportSecurityBinding = new BasicHttpBinding();
    transportSecurityBinding.Security.Mode = BasicHttpSecurityMode.Transport;
    transportSecurityBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
    transportSecurityBinding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.Certificate;
    var customTransportSecurityBinding = new CustomBinding(transportSecurityBinding);

    var messageCredentialBinding = new BasicHttpBinding();
    messageCredentialBinding.Security.Mode = BasicHttpSecurityMode.TransportWithMessageCredential;
    messageCredentialBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
    messageCredentialBinding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.Certificate;
    var customMessageCredentialBinding = new CustomBinding(messageCredentialBinding);

    // replace transport binding element from message credential binding with the transportSecurityBinding transport binding
    // which will include the cert for SSL mutual auth.
    customTransportSecurityBinding.Elements[customTransportSecurityBinding.Elements.Count - 1] = customMessageCredentialBinding.Elements[customMessageCredentialBinding.Elements.Count - 1];

var client = new SomeSoapClient(customTransportSecurityBinding, ea);
于 2012-05-22T13:55:54.617 に答える