2009-04-23 6 views
6

Ich habe eine Client/Server WCF-Anwendung, die eine Art Benutzerauthentifizierung gegen eine Datenbank benötigt. Die Anwendung (sowohl Client als auch Server zusammen) wird entwickelt, um an Dutzende von Kunden für die Verwendung in ihren Intranets verkauft zu werden. Wir sind nicht allzu besorgt über die Verschlüsselung der meisten Daten, die über die Leitung übertragen werden, außer natürlich während der Authentifizierung.WCF, Sicherheit und Zertifikate

Wenn ich über WCF-Sicherheit nachdenke, komme ich immer wieder auf die Idee zurück, dass wir x509-Zertifikate verwenden sollten. Unsere Kunden werden jedoch keinesfalls Details über die Beantragung, den Kauf und die Installation dieser Zertifikate wissen wollen.

Ich würde gerne zuerst wissen, was die bevorzugte Methode der Implementierung von Benutzername/Passwort-Authentifizierung in diesem Szenario ist. Wenn der Einsatz von Zertifikaten erforderlich ist, muss der Kunde eigene Zertifikate von einer vertrauenswürdigen Zertifizierungsstelle beantragen, oder können wir als Softwareanbieter Zertifikate erstellen, die der Kunde verwenden kann?

Wirklich ich bin auf der Suche nach einer Best Practice, mit der geringsten Reibung für unsere Kunden.

Danke!

Bearbeiten: Ich verwende NetTcpBinding, und mein Server läuft als Windows-Dienst.

Antwort

5

Also Benutzername/Passwörter erfordert keine Client-Zertifikate, wie Sie sicher wissen, es erfordert nur ein HTTPS-Zertifikat auf dem Server, der den WCF-Dienst hostet - sobald Sie das haben, können Sie den Standard-Benutzername/Passwort verwenden Auth-Bits (WCF erlaubt keine nachrichtenbasierte Authentifizierung ohne HTTPS).

Wenn Sie die Client-Zertifikatswurzel durchgehen möchten, haben Sie den Vorteil der Nichtabstreitbarkeit - Sie können sicher sein, dass die Maschine sendet, wer sie ist (außer jemand hat das Zertifikat gestohlen, was weniger wahrscheinlich ist als ein Benutzername und Passwort Kombination gehen über). Sie als Softwareanbieter können als Ihre eigene Zertifizierungsstelle agieren und Ihre eigenen Client-Zertifikate generieren (je nach Infrastruktur gibt es mehrere Möglichkeiten), aber dann müssen Sie die Clients so konfigurieren, dass sie Ihrer Root-CA vertrauen.

Wenn der Server und der Client in einer Domänenumgebung laufen, können Sie transport security with Windows authentication verwenden (Sie verwenden TCP-Bindung, so dass die Interoperabilität sowieso nicht mehr funktioniert!) Der zusätzliche Bonus ist die Authentifizierung ist transparent und Sie don ' Ich brauche keine Zertifikate überall. Wenn Sie die Serveridentität überprüfen möchten, ist message security with Windows authentication der Trick.

+0

Danke! Etwas, das ich vergessen habe zu erwähnen, ist, dass ich NetTcpBinding verwende. Denken Sie auch daran, dass der Server auch für mehrere Kunden bereitgestellt wird, was die Hauptursache für mein Problem in Bezug auf Zertifikate ist. – chris

+0

OK aktualisiert die Antwort – blowdart

1

Wenn Sie Firewall-Grenzen überschreiten, dann werden Zertifikate die beste Lösung sein. Ich weiß nicht viel über die Besonderheiten von Anwendungen für Zertifikate oder Ihre Anwendung. Leider, soweit ich weiß, denke ich, dass Sie ihnen helfen müssen, Zertifikate zu beantragen, oder sie müssen es selbst tun, es sei denn, sie wollen selbst einen Zertifikatsserver installieren. Wenn die App intern ist, funktioniert die Windows-Authentifizierung und ist SEHR einfach, aber wenn Sie glauben, dass Ihre Clients Ihre Anwendung über Firewall-Grenzen hinweg nutzen, können Sie auch Zeit in die Verwendung von Zertifikaten investieren, da Zertifikate überall funktionieren. Jetzt gibt es eine sogenannte föderierte Sicherheit, bei der Sie die Berechtigung der Authentifizierung an eine andere Entität delegieren. Ich denke, das wird verwendet, wenn Sie sagen, dass Sie Domänen haben und delegieren wollen, sagen jemand von einer anderen Domain, die nicht auf Ihrer Domain ist, aber es ist ziemlich komplex und mein Verständnis davon ist sehr begrenzt, aber durch den Klang Ihrer Anforderungen Zertifikate sind der Weg zu gehen.

Sicherheit soll nicht einfach sein :)

2

Ich habe Projekt in Produktion bekommt, die zu Ihrem Szenario ähnlich ist. Ich habe einen Windows-Dienst, der Endpunkte über netTCPBinding hostet, und ich habe x509-Zertifikate verwendet ... obwohl in meinem Fall die Absicht war, sowohl die Transport- als auch die Nachrichtenschicht zu verschlüsseln, da ich nicht vertrauenswürdige Sicherheitsgrenzen überquerte. Mir ging es weniger um die Bereitstellung einer Authentifizierung/Autorisierung als um die Anwesenheit des Zertifikats.

Ähnlich wie bei Ihren Intranetszenarien (ich nehme an), hatte ich bei der Installation die Autorität über den Server und die Clientcomputer ... oder könnte zumindest einige der Installationsbedingungen diktieren.

Anstatt die x509-Zertifikate zu kaufen und den Kunden mit diesen Kosten zu belasten, entschied ich mich, unsere eigenen zu rollen. Wir haben einen unserer Win2003-Server als CA eingerichtet und ein eigenes Certification Authority-Zertifikat ausgestellt. Wir erzeugten dann ein x509-Zertifikat für den Server sowie einzelne x509-Zertifikate für die Clients.

Die Client- und Serverzertifikate wurden sowohl auf den Clients als auch auf dem Server (sofern zutreffend) in den persönlichen Benutzerspeicher auf Computerebene installiert. Wir haben unser CA-Zertifikat auch direkt in den Abschnitt "Vertrauenswürdige Stammzertifizierungsstellen" installiert, sodass unsere Client- und Serverzertifikate vertrauenswürdig sind.

Da ich weniger mit Authentifizierung/Autorisierung beschäftigt war, weiß ich nicht, was ich empfehlen sollte, um mit verbindlichen Zertifikaten für einzelne Benutzer umzugehen und detaillierter als auf Maschinenebene (meine Lösung war Windows-Dienst für Windows) Servicekommunikation - völlig unbeaufsichtigt. Ich würde denken, dass Sie ein Zertifikat für jeden Benutzer benötigen würden, indem Sie es in seinen persönlichen Benutzerspeicher in der Zertifikat-MMC installieren. Die Laufzeitimplementierung richtet sich danach, wie Sie WCF so konfigurieren, dass die Cert-Suche durchgeführt wird. Daher sollte es relativ einfach sein.

Während des gesamten Prozesses verließ ich mich stark auf das, was ich aus diesem großartigen CodeProject-Artikel gelernt hatte: Securing WCF Services with Certificates. Es führt Sie durch die Generierung/Installation der Zertifikate. Die Beispiel-WCF-Anwendung ist IIS-gehostet, aber ich konnte die Konfigurationsabschnitte ziemlich leicht von web.config in app.config übersetzen.

In meinem Fall habe ich die Webschnittstelle zum Anfordern von Zertifikaten in Win2003 für das Web selbst verfügbar gemacht, so dass der Client Zertifikate in Zukunft direkt anfordern kann. Wir haben Genehmigungskontrolle, also funktioniert es gut. Ich hatte noch keine Notwendigkeit, neue Zertifikate zu generieren, daher kann ich nicht sagen, wie viel Reibung das mit sich bringen würde.

+0

Vielen Dank für CodeProject Link. –