Hallo,
im Gegensatz zu den meisten Beschreibungen möchte ich über den IIS kein Client-Zertifikat verifizieren, sondern bei einer Übertragung einer Soap-Nachricht mit Versenden. Aus irgendeinem Grund wird bei der Weiterleitung der Nachricht über den Web-Service
das von der Gegenstelle geforderte Zertifikat nicht mehr mit übertragen.
Der Nachrichtenverlauf erfolgt so:
1. Clients senden ihre Nachricht an den WebService der am IIS eingerichtet ist. (da intern ohne weitere Authentifizierung)
2. Der WebService soll die Nachricht vom Client entgegennehmen und unverändert an eine externe Zieladresse weiterleiten. Dabei soll das Client-Zertifikat für den Ziel-Server mitgeben werden.
Das Client-Zertifikat liegt im Zertifikatsspeicher (Lokaler Computer/Eigene Zertifikate) und wird dort auch gefunden.
Folgendes ist eingerichtet:
Mit WCF wurde ein Web-Service und eine Clientprogramm erstellt. Der Web-Service läuft auf dem IIS 7.5 unter Windows Server 2008 R2. Das Clientprogramm sammelt die Daten und sendet diese als Soap-Nachricht an den Web-Service. Der verwendete Service-Endpunkt
ist in der web.config des Web-Services definiert. Der Client ruft den Web-Service erfolgreich auf.
In der Implementierung des Services (ab hier komplett in C# und nicht über Konfiguration) wird eine neuer Client-Aufruf für die externe Ziel-Adresse erstellt:
- der Client wird neu erstellt
- das Binding wird neu aufgebaut (um das Zertifikat mitsenden zu können)
- die neue Zieladresse angegeben
- das Zertifikat wird ermittelt+gefunden und dem Client übergeben
Code für Erstellung des neuen Clients im WebService:
CustomBinding binding = new CustomBinding();
binding.Elements.Add(new TextMessageEncodingBindingElement(MessageVersion.Soap11, Encoding.UTF8));
HttpsTransportBindingElement transport = new HttpsTransportBindingElement();
transport.AuthenticationScheme = AuthenticationSchemes.Basic;
transport.RequireClientCertificate = true;
binding.Elements.Add(transport);
var uri = "https://xxxxxxxxx";
var address = new EndpointAddress(uri);
var client = new MeinEndpunkt(binding, address);
client.ClientCredentials.UserName.UserName = "XYZ";
client.ClientCredentials.UserName.Password = "xxx";
client.ClientCredentials.ClientCertificate.SetCertificate(
StoreLocation.LocalMachine,
StoreName.My,
X509FindType.FindBySerialNumber,
"XX XX XX XX XX XX");
client.MeinEndpunkt(message);
Problem:
Beim Weiterleiten vom WebService zur eigentlichen Zieladresse wird das Client-Zertifikat nicht mit gesendet. Ich kann aber erkennen, dass das Zertifikat im Zertifikat-Store gefunden wird. Das Zertifikat wird dem neu erstellten Client übergeben.
Anmerkung:
Um die Verbindung zu prüfen habe ich ein Testprogramm geschrieben, das nicht über den Server läuft, sondern direkt vom Client die externe Zieladresse aufruft. Das Testprogramm enthält exakt den selben C#-Code, der für die Implementierung des Services verwendet
wird (siehe Codeabschnitt). Dieser Test war erfolgreich. Das Zertifikat wird wie erwartet mit gesendet.
Ein direkter Versand über das Tools SoapUI funktioniert ebenfalls.
Frage:
Wie kann ich sicherstellen, dass das Zertifikat mit versendet wird? Welche Möglichkeiten zum Debugging des Services (außer Logging und Wiresshark) gibt es noch?