Megosztás:


Üzenet biztonsági tanúsítványa

A MessageSecurity-minta bemutatja, hogyan implementálhat olyan alkalmazást, amely az X.509 v3-tanúsítványhitelesítést használó WS-Security használ az ügyfél számára, és a kiszolgáló X.509 v3 tanúsítványával igényel kiszolgálói hitelesítést. Ez a minta olyan alapértelmezett beállításokat használ, amelyek az ügyfél és a kiszolgáló közötti összes alkalmazásüzenetet aláírják és titkosítják. Ez a minta a WSHttpBinding alapul, és egy ügyfélkonzol-programból és az Internet Information Services (IIS) által üzemeltetett szolgáltatástárból áll. A szolgáltatás megvalósít egy szerződést, amely egy kérés-válasz kommunikációs mintát határoz meg.

Jegyzet

A minta telepítési eljárása és összeállítási utasításai a témakör végén találhatók.

A minta bemutatja, hogyan szabályozható a hitelesítés konfigurációval, és hogyan szerezheti be a hívó identitását a biztonsági környezetből, ahogyan az az alábbi mintakódban is látható.

public class CalculatorService : ICalculator
{
    public string GetCallerIdentity()
    {
        // The client certificate is not mapped to a Windows identity by default.
        // ServiceSecurityContext.PrimaryIdentity is populated based on the information
        // in the certificate that the client used to authenticate itself to the service.
        return ServiceSecurityContext.Current.PrimaryIdentity.Name;
    }
    ...
}

A szolgáltatás egy végpontot tesz elérhetővé a szolgáltatással való kommunikációhoz, és egy végpontot, amely a szolgáltatás WSDL-dokumentumát a WS-MetadataExchange protokoll használatával teszi közzé, amelyet a konfigurációs fájl (Web.config) használatával határoz meg. A végpont egy címből, egy kötésből és egy szerződésből áll. A kötés egy szabványos <wsHttpBinding>-elemmel van konfigurálva, amely alapértelmezés szerint az üzenetbiztonságot használja. Ez a minta a clientCredentialType attribútumot tanúsítványra állítja, hogy ügyfél-hitelesítést igényeljen.

<system.serviceModel>
    <protocolMapping>
      <add scheme="http" binding="wsHttpBinding"/>
    </protocolMapping>
    <bindings>
      <wsHttpBinding>
        <!--
        This configuration defines the security mode as Message and
        the clientCredentialType as Certificate.
        -->
        <binding>
          <security mode ="Message">
            <message clientCredentialType="Certificate" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <!--For debugging purposes set the includeExceptionDetailInFaults attribute to true-->
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False" />
          <!--
        The serviceCredentials behavior allows one to define a service certificate.
        A service certificate is used by the service to authenticate itself to its clients and to provide message protection.
        This configuration references the "localhost" certificate installed during the setup instructions.
        -->
          <serviceCredentials>
            <serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
            <clientCertificate>
              <!--
            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 certification 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" />
            </clientCertificate>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

A viselkedés megadja a szolgáltatás hitelesítő adatait, amelyeket az ügyfél a szolgáltatás hitelesítésekor használ. A kiszolgálótanúsítvány tulajdonosának neve a findValue elem < attribútumában van megadva.

<!--For debugging purposes, set the includeExceptionDetailInFaults attribute to true.-->
<behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False" />
          <!--
        The serviceCredentials behavior allows one to define a service certificate.
        A service certificate is used by the service to authenticate itself to its clients and to provide message protection.
        This configuration references the "localhost" certificate installed during the setup instructions.
        -->
          <serviceCredentials>
            <serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
            <clientCertificate>
              <!--
            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 certification 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" />
            </clientCertificate>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>

Az ügyfélvégpont konfigurációja a szolgáltatásvégpont, a kötés és a szerződés abszolút címéből áll. Az ügyfélkötés a megfelelő biztonsági és hitelesítési móddal van konfigurálva. Számítógépközi forgatókönyv esetén győződjön meg arról, hogy a szolgáltatásvégpont címe ennek megfelelően módosul.

<system.serviceModel>
    <client>
      <!-- Use a behavior to configure the client certificate to present to the service. -->
      <endpoint address="http://localhost/servicemodelsamples/service.svc" binding="wsHttpBinding" bindingConfiguration="Binding1" behaviorConfiguration="ClientCertificateBehavior" contract="Microsoft.Samples.Certificate.ICalculator"/>
    </client>

    <bindings>
      <wsHttpBinding>
        <!--
        This configuration defines the security mode as Message and
        the clientCredentialType as Certificate.
        -->
        <binding name="Binding1">
          <security mode="Message">
            <message clientCredentialType="Certificate"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
...
</system.serviceModel>

Az ügyfél implementációja beállíthatja a tanúsítvány használatát a konfigurációs fájlon vagy a kódon keresztül. Az alábbi minta bemutatja, hogyan állíthatja be a tanúsítványt a konfigurációs fájlban való használatra.

<system.serviceModel>
  ...

<behaviors>
      <endpointBehaviors>
        <behavior name="ClientCertificateBehavior">
          <!--
        The clientCredentials behavior allows one to define a certificate to present to a service.
        A certificate is used by a client to authenticate itself to the service and provide message integrity.
        This configuration references the "client.com" certificate installed during the setup instructions.
        -->
          <clientCredentials>
            <clientCertificate findValue="client.com" storeLocation="CurrentUser" storeName="My" x509FindType="FindBySubjectName"/>
            <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>

</system.serviceModel>

Az alábbi minta bemutatja, hogyan hívhatja meg a szolgáltatást a programban.

// Create a client.
CalculatorClient client = new CalculatorClient();

// Call the GetCallerIdentity service operation.
Console.WriteLine(client.GetCallerIdentity());
...
//Closing the client gracefully closes the connection and cleans up resources.
client.Close();

A minta futtatásakor a műveleti kérelmek és a válaszok megjelennek az ügyfélkonzol ablakában. Nyomja le az ENTER billentyűt az ügyfélablakban az ügyfél leállításához.

CN=client.com
Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714
Press <ENTER> to terminate client.

Az Üzenetbiztonsági minták Setup.bat kötegfájlja lehetővé teszi az ügyfél és a kiszolgáló megfelelő tanúsítványokkal való konfigurálását egy olyan üzemeltetett alkalmazás futtatásához, amely tanúsítványalapú biztonságot igényel. A kötegfájl három módban futtatható. Egyszámítógépes módban való futtatáshoz írja be, hogy setup.bat a Visual Studio fejlesztői parancssorában; szolgáltatás módban való futtatáshoz írja be, hogy setup.bat szolgáltatás; ügyfél módban való futtatáshoz pedig írja be, hogy setup.bat ügyfél. A minta számítógépek közötti futtatásakor használja az ügyfél- és kiszolgálómódot. A részletekért tekintse meg a témakör végén található beállítási eljárást. Az alábbiakban röviden áttekintheti a kötegfájlok különböző szakaszait, hogy azok a megfelelő konfigurációban való futtatásukhoz módosíthatók legyenek:

  • Az ügyféltanúsítvány létrehozása.

    A kötegfájl következő sora hozza létre az ügyféltanúsítványt. A megadott ügyfélnevet használják a létrehozott tanúsítvány tárgyneveként. A tanúsítvány a My tárolóban, a CurrentUser tároló helyszínén található.

    echo ************
    echo making client cert
    echo ************
    makecert.exe -sr CurrentUser -ss MY -a sha1 -n CN=%CLIENT_NAME% -sky exchange -pe
    
  • Az ügyféltanúsítvány telepítése a kiszolgáló megbízható tanúsítványtárolójába.

    A kötegfájl következő sora átmásolja az ügyféltanúsítványt a kiszolgáló TrustedPeople tárolójába, hogy a kiszolgáló meghozhassa a megfelelő megbízhatósági vagy nem megbízhatósági döntéseket. Ahhoz, hogy a TrustedPeople áruházban telepített tanúsítványt egy Windows Communication Foundation (WCF) szolgáltatás megbízhatónak minősítse, az ügyféltanúsítvány-érvényesítési módot PeerOrChainTrust vagy PeerTrustkell beállítani. Tekintse meg az előző szolgáltatáskonfigurációs mintát, amelyből megtudhatja, hogyan teheti ezt meg egy konfigurációs fájl használatával.

    echo ************
    echo copying client cert to server's LocalMachine store
    echo ************
    certmgr.exe -add -r CurrentUser -s My -c -n %CLIENT_NAME% -r LocalMachine -s TrustedPeople
    
  • A kiszolgálótanúsítvány létrehozása.

    A Setup.bat kötegfájl alábbi sorai hozzák létre a használni kívánt kiszolgálótanúsítványt.

    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
    

    A %SERVER_NAME% változó megadja a kiszolgáló nevét. A tanúsítvány tárolása a LocalMachine áruházban történik. Ha a Setup.bat kötegfájl egy szolgáltatás argumentummal (például setup.bat szolgáltatás) fut, a %SERVER_NAME% tartalmazza a számítógép teljes tartománynevét. Ellenkező esetben alapértelmezés szerint a localhost lesz.

  • A kiszolgálótanúsítvány telepítése az ügyfél megbízható tanúsítványtárolójába.

    Az alábbi sor a kiszolgálótanúsítványt az ügyfél megbízható személyek tárolójába másolja. Erre a lépésre azért van szükség, mert a Makecert.exe által létrehozott tanúsítványokat az ügyfélrendszer nem implicit módon megbízhatónak minősíti. Ha már rendelkezik olyan tanúsítvánnyal, amely egy ügyfél megbízható főtanúsítványában gyökerezik – például egy Microsoft által kiadott tanúsítványban –, nem szükséges az ügyféltanúsítvány-tároló kiszolgálótanúsítvánnyal való feltöltésének ez a lépése.

    certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
    
  • Engedélyek megadása a tanúsítvány titkos kulcsához.

    A Setup.bat fájl alábbi sorai elérhetővé teszik a LocalMachine tárolóban tárolt kiszolgálói tanúsítványt a ASP.NET feldolgozói folyamatfiók számára.

    echo ************
    echo setting privileges on server certificates
    echo ************
    for /F "delims=" %%i in ('"%ProgramFiles%\ServiceModelSampleTools\FindPrivateKey.exe" My LocalMachine -n CN^=%SERVER_NAME% -a') do set PRIVATE_KEY_FILE=%%i
    set WP_ACCOUNT=NT AUTHORITY\NETWORK SERVICE
    (ver | findstr /C:"5.1") && set WP_ACCOUNT=%COMPUTERNAME%\ASPNET
    echo Y|cacls.exe "%PRIVATE_KEY_FILE%" /E /G "%WP_ACCOUNT%":R
    iisreset
    

    Jegyzet

    Ha a Windows egy nem amerikai angol kiadását használja, szerkesztenie kell a Setup.bat fájlt, és az "NT AUTHORITY\NETWORK SERVICE" fiók nevét le kell cserélnie az adott régióra vonatkozó megfelelőjére.

Jegyzet

A kötegfájlban használt eszközök a C:\Program Files\Microsoft Visual Studio 8\Common7\tools vagy a C:\Program Files\Microsoft SDKs\Windows\v6.0\bin fájlban találhatók. Az egyik könyvtárnak szerepelnie kell a rendszer elérési útjában. Ha telepítve van a Visual Studio, a legegyszerűbben úgy érheti el ezt a könyvtárat az elérési úton, ha megnyitja a Visual Studio fejlesztői parancssorát. Kattintson a Start, majd a Minden program, Visual Studio 2012, Eszközökelemre. Ez a parancssor már konfigurálta a megfelelő elérési utakat. Ellenkező esetben manuálisan kell hozzáadnia a megfelelő könyvtárat az elérési úthoz.

A minta beállítása, összeállítása és futtatása

  1. Győződjön meg arról, hogy elvégezte a Windows Communication Foundation-minták One-Time beállítási eljárását.

  2. A megoldás C# vagy Visual Basic .NET kiadásának létrehozásához kövesse Windows Communication Foundation-mintákcímű témakör utasításait.

A minta futtatása ugyanazon a számítógépen

  1. Nyisson meg egy fejlesztői parancssort a Visual Studióhoz rendszergazdai jogosultságokkal, és futtassa a Setup.bat a minta telepítési mappából. Ez telepíti a minta futtatásához szükséges összes tanúsítványt.

    Jegyzet

    A Setup.bat kötegfájl úgy lett kialakítva, hogy a Visual Studióhoz készült fejlesztői parancssorból fusson. Megköveteli, hogy az elérési út környezeti változója arra a könyvtárra mutasson, amelyben az SDK telepítve van. Ez a környezeti változó automatikusan be van állítva a Visual Studio fejlesztői parancssorában (2010).

  2. Ellenőrizze a szolgáltatáshoz való hozzáférést egy böngészőben a cím http://localhost/servicemodelsamples/service.svcmegadásával.

  3. Indítsa el a Client.exe a \client\bin fájlból. Az ügyféltevékenység megjelenik az ügyfélkonzol-alkalmazásban.

  4. Ha az ügyfél és a szolgáltatás nem tud kommunikálni, tekintse meg a WCF minták hibaelhárítási tippeket a éscímsorok alatt.

A minta futtatása számítógépeken

  1. Hozzon létre egy könyvtárat a szolgáltatásszámítógépen. Hozzon létre egy servicemodelsamples nevű virtuális alkalmazást ehhez a könyvtárhoz az Internet Information Services (IIS) felügyeleti eszközével.

  2. Másolja a szolgáltatásprogram fájljait az \inetpub\wwwroot\servicemodelsamples fájlból a szolgáltatásszámítógép virtuális könyvtárába. Győződjön meg arról, hogy a \bin alkönyvtárban lévő fájlokat másolja. Másolja a Setup.bat, Cleanup.batés ImportClientCert.bat fájlokat is a szolgáltatásszámítógépre.

  3. Hozzon létre egy könyvtárat az ügyfélszámítógépen az ügyfél bináris fájljaihoz.

  4. Másolja az ügyfélprogram fájljait az ügyfélszámítógép ügyfélkönyvtárába. Másolja a Setup.bat, Cleanup.batés ImportServiceCert.bat fájlokat is az ügyfélbe.

  5. A kiszolgálón futtassa setup.bat szolgáltatás a Visual Studio fejlesztői parancssorában rendszergazdai jogosultságokkal. A szolgáltatás argumentummal futtatott setup.bat létrehoz egy szolgáltatástanúsítványt a számítógép teljes tartománynevével, és exportálja a szolgáltatástanúsítványt egy Service.cer nevű fájlba.

  6. Szerkessze a Web.config-et, hogy tükrözze az új tanúsítvány nevét (a findValue< attribútumában), amely megegyezik a számítógép teljes tartománynevével.

  7. Másolja a Service.cer fájlt a szolgáltatáskönyvtárból az ügyfélszámítógép ügyfélkönyvtárába.

  8. Az ügyfélen futtassa setup.bat ügyfél a Visual Studio fejlesztői parancssorában rendszergazdai jogosultságokkal. Az ügyfél argumentummal futtatott setup.bat létrehoz egy client.com nevű ügyféltanúsítványt, és exportálja az ügyféltanúsítványt egy Client.cer nevű fájlba.

  9. Az ügyfélszámítógép Client.exe.config fájljában módosítsa a végpont címértékét úgy, hogy az megfeleljen a szolgáltatás új címének. Ehhez cserélje le a localhostot a kiszolgáló teljes tartománynevére.

  10. Másolja a Client.cer fájlt az ügyfélkönyvtárból a kiszolgáló szolgáltatáskönyvtárába.

  11. Az ügyfélen futtassa a ImportServiceCert.bat a Visual Studio fejlesztői parancssorában rendszergazdai jogosultságokkal. Ez importálja a szolgáltatástanúsítványt a Service.cer fájlból a CurrentUser – TrustedPeople tárolóba.

  12. A kiszolgálón futtassa a ImportClientCert.bat a Visual Studio fejlesztői parancssorában rendszergazdai jogosultságokkal. Ez importálja az ügyféltanúsítványt a Client.cer fájlból a LocalMachine – TrustedPeople áruházba.

  13. Az ügyfélszámítógépen indítsa el a Client.exe egy parancssori ablakból. Ha az ügyfél és a szolgáltatás nem tud kommunikálni, tekintse meg a WCF minták hibaelhárítási tippeket a éscímsorok alatt.

A minta utáni tisztítás

  • Miután befejezte a minta futtatását, futtassa a Cleanup.bat-t a mintamappában.

    Jegyzet

    Ez a szkript nem távolítja el az ügyfél szolgáltatástanúsítványait, amikor a mintát számítógépeken futtatja. Ha windowsos kommunikációs alap (WCF) mintákat futtat, amelyek tanúsítványokat használnak a számítógépeken, mindenképpen törölje a CurrentUser – TrustedPeople áruházban telepített szolgáltatástanúsítványokat. Ehhez használja a következő parancsot: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name> Például: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.