EDIT:
Ich habe schließlich festgestellt, dass IClientMessageInspector nicht zu reflektieren scheint Nachricht signieren, so dass, wenn ich tatsächlich eine Signatur in meiner Anfrage bekam ich es nicht wissen. Also jetzt für meine neue, echte Frage ...
Wie kann ich einen WCF-Client so konfigurieren, dass er sowohl das SSL-Client-Zertifikat vorlegt als auch den SOAP-Header signiert?
var myBinding = new BasicHttpBinding();
myBinding.Security.Mode = BasicHttpSecurityMode.TransportWithMessageCredential;
myBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
myBinding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.Certificate;
Dies führt dazu, dass die Kopfzeile einen signierten Zeitstempel enthält. Allerdings wird das Client-Zertifikat nicht mehr angezeigt, und ich komme nicht über SSL hinaus. Wenn ich die zweite Zeile ändere in:
myBinding.Security.Mode = BasicHttpSecurityMode.Transport;
Dann komme ich an SSL vorbei, aber mein SOAP-Header enthält nicht mehr den Signierungsblock.
Gibt es eine Möglichkeit, wie ich HttpWebRequest erreichen kann, so dass ich das SSL-Client-Zertifikat manuell wie so anhängen kann?
webRequest.ClientCertificates.Add(certLoader.Load(@"c:\somecert.pfx"));
Ursprüngliche Frage
Ich arbeite an einem WCF-Client, der mit einem Dienst zusammenarbeiten muss, der von einem Drittanbieter bereitgestellt wird, der eine Forum Sentry-Netzwerkanwendung für den sicheren Zugriff verwendet. Sie erfordern SSL mit einem Client-Zertifikat auf der Transportebene sowie ein o:Security-Element mit Signatur unter Verwendung eines Zertifikats im Header. Ich bin in der Lage, das eine oder das andere mit Standardbindungen zu erreichen, aber ich scheine nicht in der Lage zu sein, beides gleichzeitig zu erreichen. Im Idealfall soll die Nachricht mit einem anderen Zertifikat als dem SSL-Client-Zertifikat signiert werden, aber sie sagten, wir könnten dasselbe Zertifikat sowohl für die SSL-Client-Authentifizierung als auch zum Signieren der Nachricht verwenden.
Ich bin bereit, alles an dieser Stelle zu tun, um dies zu arbeiten, einschließlich der Verwendung einer CustomBinding, wenn nötig.
Ich kann den SSL-Teil wie folgt zum Laufen bringen:
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 });