Anmelden

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>
       
    Top

    Wir arbeiten mit Software von http://www.campus21.de.

    Verantwortlich für angezeigte Daten ist der Webdomain-Eigentümer laut Impressum.

    Suche