Characteristic of this mode is to use http. The use of HTTPS is not required. The SSL encryption is performed by the WCF in worker process. This requires a certificate with private key. The following actions are required:
Uhrzeit auf Server-Seite und Clientseite müssen ohne erhebliche Abweichung sein. Anderenfalls kommt es auf Client-Seite beim Verbindungsausfau zu einem ziemlich unspezifischen Fehler.
The following actions are required to set up a SSL connection with message security:
- Creation of the key pair and a certificate on the server
- Worker process must have read access to key file
- set up Web.config: switch endpoints to wsHttpBinding with security mode="Message ", message clientCredentialType="username", now it is possible to configure a certificate
- Export the certificate file at the server
- Import the certificate file into the certificate store on the client
- uooo
Werkzeuge
Managementkonsole
Mit der Managementkonsole können Sie Zertifikate exportieren (Server-Seite), importieren (Client-Seite), löschen sowie Zugriffsrechte auf private Schlüssel verwalten (Server-Seite). Mit der Managementkonsole können Sie keine Zertifikate erstellen.
Die Zertifikate für Security mode Message lassen sich am besten mit dem Tool certmgr.exe verwalten. Die unter Systemsteuerung > Internetoptionen > Inhalte > Zertifikate angezeigten Zertifikatauflistungen sind nicht brauchbar.
Kommandozeilenwerkzeuge
Die Zertifikat-Erstellung ist etwas abendteuerlich. Hier einige Hinweise:
- .NET Framework 2.0 SDK installieren bzw. die Werkzeuge beschaffen (makecert.exe, certmgr.exe, FindPrivateKey.exe)
- C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin, hier gibt es eine sdkvars.bat, die insbesonder den PATH erweiterrn sollen (Zertifikat-Tools, z.B. makecert.exe)
set PATH=C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin;PATH - in dem Beispiel MembershipAndRoleProvider\CS (C:\samples\WCFWFCardSpace\WCF\Basic\Service\Behaviors\Security) befindet sich ein setup.bat, welches das Zertifikat, den Schlüsselsatz (Schlüsseldatei) und eine Zertifikatdatei (.cer) erstellt.
- FindPrivateKey.exe kompilieren und zu setup.bat kopieren (ist erforderlich um Zugriffsrechte des Serverprozesses auf den privaten Schlüssel einzurichten)
- danach hat man im IIS-Manager ein Serverzertifikat für den Server, allerdings ohne Name
- in web.config des Services kann man aber das Zertifikat auch über Fingerabdruck referenzieren
setup.bat funktioniert jedoch nicht auf allen Windowssystemem korrekt, so dass man eingreifen muss:
- SERVER_NAME ist nicht gesetzt, damit FindPrivateKey.exe in setup.bat nicht funktionstüchtig
- außerdem WP_ACCOUNT=%COMPUTERNAME%\ASPNET nicht gültig bei Vista/IIS7
echo ************
echo Server cert setup starting
echo %SERVER_NAME%
echo ************
echo making server cert
echo ************
makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%SERVER_NAME% -sky exchange -pe
IF DEFINED EXPORT_SERVICE (
echo ************
echo exporting service cert to service.cer
echo ************
certmgr.exe -put -r LocalMachine -s My -c -n %SERVER_NAME% service.cer
) ELSE (
echo ************
echo copying server cert to client's CurrentUser store
echo ************
certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
)
GOTO :EOF
Löschen:
certmgr.exe -del -r LocalMachine -s My -c -n %SERVER_NAME%
Vorgehensweise in Einzelschritten
Zertifikat erstellen
Das Zertifikat muss erstellt worden sein, es ist im IIS-Manager 7 als Serverzertifikat sichtbar. Das Zertifikat ist auch in der Managementkonsole unter Eigene Zertifikate sichtbar (mmc von Kommandozeile starten, Snap-In Zertifikate - Computerkonto hinzufügen).
makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=QUAD -sky exchange -pe
Achten Sie darauf, dass obiger Aufruf makecert.exe nicht mehrmals aufgerufen werden sollte, da gleichnamige Zertifikate entstehen, die bei nachfolgender Verwendung nicht (per Name) unterschieden werden können. In dem Fall sollte eines wieder gelöscht werden:
certmgr.exe -del -r LocalMachine -s My -c -n www.smaccware.com
Anzeige der installierten Zertifikate:
certmgr.exe -all -r LocalMachine -s My -c
Im UI (Systemsteuerung > Internetoptionen) werden die LocalMachine-Zertifikate nicht sichtbar.
Exportieren
In der Managementkonsole bzw IIS-Manager 7 (oberster Knoten > Serverzertifikate) können Sie das Zertifikat öffnen.
Installieren
Das Zertifikat wird nun in der Web.config des WCF-Services konfiguriert.
< serviceCertificate storeLocation ="LocalMachine"
storeName ="My"
x509FindType ="FindBySubjectName"
findValue ="QUAD" />
oder
< serviceCertificate x509FindType="FindByThumbprint"
findValue="3bdec3288f7c6e4419f395736e922e98295e2403"/>
Bei Aufruf des Services http://localhost/servicemodelsamples/service.svc erscheint möglicherweise die Fehlermeldung "Der Schlüsselsatz ist nicht vorhanden". Damit ist gemeint: es bestehen keine Zugriffsrechte auf den privaten Schlüssel.
http://msdn.microsoft.com/en-us/library/ms731899.aspx Working with Certificates
http://msdn.microsoft.com/en-us/library/aa702621.aspx How to: Make X.509 Certificates Accessible to WCF
FindPrivateKey.exe ermittelt den Pfad der Schlüsseldatei (mit privaten Schlüsseln zu den Zertifikaten). Es gibt zwei Möglichkeiten: SubjectName oder Fingerprint. Den Fingerprint bekommt man auf der Zertifikatanzeige (IIS-Manager).
FindPrivateKey.exe My LocalMachine -n CN=QUAD -a
FindPrivateKey.exe My LocalMachine
-t "3b de c3 28 8f 7c 6e 44 19 f3 95 73 6e 92 2e 98 29 5e 24 03" -a
cacls.exe verwaltet Berechtigungen auf Schlüsseldateien. Der Workerprozess NT-AUTORITÄT\NETZWERKDIENST muss Leserechte bekommen
cacls.exe C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\
e357dcc23141d7d0872ffa9df4fa5c6c_a72403df-a736-460e-b749-edd2d5ef8a64
/E /G "NT AUTHORITY\NetworkService":R
Entnehmen Sie den vollständigen Pfad der Schlüsseldatei aus der Ausgabe von FindPrivateKey.exe. Beachten Sie bei Aufruf von cacls.exe, dass es auf deutschen Windows-System "NT-AUTORITÄT\NETZWERKDIENST" als Service-Account heissen muss.
Serverzertifikat oder eigenes Zertifikat
Ungeklärt ist noch, ob man auch ein direkt im IIS-manager erzeugtes Zertifikat verwenden kann.
Client
Zum Abschluss muss das Zertifikat auf dem Client-Computer importiert werden, weil die Client-Applikation den öffentlichen Schlüssel des Serverzertifikat benötigt. Hier gibt es auch wieder die Möglichkeit mit certmgr.exe aus dem SDK oder mit der Managementkonsole zu arbeiten.
certmgr.exe -add service.cer -r CurrentUser -s TrustedPeople
Die Auflistung der installierten Zertifikate ist auch möglich mit:
certmgr.exe -all -r CurrentUser -s TrustedPeople
Servicekonfiguration (Web.config)
Service
Der Service muss mit binding wsHttpBinding und Security mode Message konfiguriert werden:
< service
name="Microsoft.ServiceModel.Samples.CalculatorService"
behaviorConfiguration="CalculatorServiceBehavior">
< endpoint address=""
binding="wsHttpBinding"
bindingConfiguration="Binding1"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
< endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
< /service>
< bindings>
< wsHttpBinding>
< !-- Set up a binding that uses Username as the client credential type -->
< binding name="Binding1">
< security mode ="Message">
< message clientCredentialType ="UserName"/>
< /security>
< /binding>
< /wsHttpBinding>
< /bindings>
Behaviour
Das Behaviour regelt das Authentikationsverfahren und das Zertifikat
< behavior name="CalculatorServiceBehavior">
< !-- Configure role based authorization to use the Role Provider -->
< serviceAuthorization principalPermissionMode ="UseAspNetRoles"
roleProviderName ="PostgreSqlRoleProvider" />
< serviceCredentials>
< !-- Configure user name authentication to use the Membership Provider -->
< userNameAuthentication userNamePasswordValidationMode ="MembershipProvider"
membershipProviderName ="PostgreSqlMembershipProvider"/>
< !-- Configure the service certificate -->
< serviceCertificate storeLocation ="LocalMachine"
storeName ="My" x509FindType ="FindBySubjectName" findValue ="QUAD" />
< /serviceCredentials>
< !--For debugging purposes set the includeExceptionDetailInFaults attribute to true-->
< serviceDebug includeExceptionDetailInFaults="true" />
< serviceMetadata httpGetEnabled="true"/>
< /behavior>
Auf der Client-Seite sind in den Konfigurationsdatei der Anwendung (bzw. der Webanwendung) unterhalb configuration/system.serviceModel folgende Einträge erforderlich:
- binding
- behaviors
- client
< system.serviceModel>
< bindings>
< wsHttpBinding>
< !-- Set up a binding that uses Username as the client credential type -->
< binding name="wsHttpBinding" maxReceivedMessageSize="524288">
< security mode="Message" >
< message clientCredentialType="UserName" establishSecurityContext="false"/>
< /security>
< /binding>
< /wsHttpBinding>
< /bindings>
< behaviors>
< endpointBehaviors>
< behavior name="ClientBehavior">
< clientCredentials>
< serviceCertificate>
< !--
Setting the certificateValidationMode to PeerOrChainTrust means that if the certificate
is in the user's Trusted People store, then it will be trusted without performing a
validation of the certificate's issuer chain. This setting is used here for convenience so that the
sample can be run without having to have certificates issued by a certificate authority (CA).
This setting is less secure than the default, ChainTrust. The security implications of this
setting should be carefully considered before using PeerOrChainTrust in production code.
-->
< authentication certificateValidationMode="PeerOrChainTrust" />
< /serviceCertificate>
< /clientCredentials>
< /behavior>
< /endpointBehaviors>
< /behaviors>
< client>
< endpoint address="http://www.smaccware.com/GServer/AdminService.svc"
binding="wsHttpBinding"
behaviorConfiguration="ClientBehavior"
bindingConfiguration="wsHttpBinding"
contract="Nsoft.Com.ServerInterface.IAdminService"
name="WsHttpBinding_AdminService" />
< /client>
< /system.serviceModel>
Fehlerbehandlung
Server blockiert nach ca 5 Starts des Clients (wsHttpBinding)
Lösung: establishSecurityContext
< message clientCredentialType ="UserName" establishSecurityContext="false"/>
http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/76c0467a-5993-46d7-a715-bafe21c63e1b
http://webservices20.blogspot.com/2009/01/wcf-performance-gearing-up-your-service.html
Wir arbeiten mit Software von http://www.campus21.de.
Verantwortlich für angezeigte Daten ist der Webdomain-Eigentümer laut Impressum.