編集:
最終的に、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 });