Megosztás:


Névtelen üzenetbiztonság

Az Üzenetbiztonság névtelen minta bemutatja, hogyan implementálható egy Windows Communication Foundation (WCF) alkalmazás, amely ügyfél-hitelesítés nélküli, de kiszolgálói hitelesítést igénylő üzenetszintű biztonságot használ az X.509-tanúsítvány használatával. Az ügyfél és a kiszolgáló közötti összes alkalmazásüzenet aláírt és titkosított. Ez a minta a WSHttpBinding mintán alapul. Ez a minta egy ügyfélkonzolprogramból (.exe) és az Internet Information Services (IIS) által üzemeltetett szolgáltatáskódtárból (.dll) á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.

Megjegyzés:

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.

Ez a minta hozzáad egy új műveletet a számológép felületéhez, amely akkor ad vissza, True ha az ügyfél hitelesítése nem történt meg.

public class CalculatorService : ICalculator
{
    public bool IsCallerAnonymous()
    {
        // ServiceSecurityContext.IsAnonymous returns true if the caller is not authenticated.
        return ServiceSecurityContext.Current.IsAnonymous;
    }
    ...
}

A szolgáltatás egyetlen végpontot tesz elérhetővé a szolgáltatással való kommunikációhoz, amely egy konfigurációs fájl (Web.config) használatával van definiálva. A végpont egy címből, egy kötésből és egy szerződésből áll. A kötés wsHttpBinding bindolással van konfigurálva. A kötés alapértelmezett biztonsági módja a wsHttpBindingMessage. Az clientCredentialType attribútum a következőre Nonevan állítva: .

<system.serviceModel>

  <protocolMapping>
    <add scheme="http" binding="wsHttpBinding" />
  </protocolMapping>

  <bindings>
    <wsHttpBinding>
     <!-- This configuration defines the security mode as Message and -->
     <!-- the clientCredentialType as None. This mode provides -->
     <!-- server authentication only using the service certificate. -->

     <binding>
       <security mode="Message">
         <message clientCredentialType="None" />
       </security>
     </binding>
    </wsHttpBinding>
  </bindings>
  ...
</system.serviceModel>

A szolgáltatáshitelesítéshez használandó hitelesítő adatok a viselkedésben<> vannak megadva. A kiszolgálótanúsítványnak ugyanazt az értéket kell tartalmaznia a SubjectName számára, mint ami az findValue attribútumhoz meg van adva, az alábbi mintakódban látható módon.

<behaviors>
  <serviceBehaviors>
    <behavior>
      <!--
    The serviceCredentials behavior allows you to define a service certificate.
    A service certificate is used by a client to authenticate the service and provide message protection.
    This configuration references the "localhost" certificate installed during the setup instructions.
    -->
      <serviceCredentials>
        <serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
      </serviceCredentials>
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="False" />
    </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. A wsHttpBinding kötés ügyfélbiztonsági módja Message. Az clientCredentialType attribútum a következőre Nonevan állítva: .

<system.serviceModel>
  <client>
    <endpoint name=""
             address="http://localhost/servicemodelsamples/service.svc"
             binding="wsHttpBinding"
             behaviorConfiguration="ClientCredentialsBehavior"
             bindingConfiguration="Binding1"
             contract="Microsoft.ServiceModel.Samples.ICalculator" />
  </client>

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

A példa beállítja a CertificateValidationModePeerOrChainTrust-re a szolgáltatás tanúsítványának hitelesítéséhez. Ez az ügyfél App.config fájljában a behaviors részben történik. Ez azt jelenti, hogy ha a tanúsítvány a felhasználó Megbízható személyek tárolójában található, akkor a tanúsítvány a tanúsítvány kiállítói láncának ellenőrzése nélkül megbízható. Ez a beállítás a kényelem érdekében használható, így a minta anélkül futtatható, hogy a hitelesítésszolgáltató (CA) tanúsítványokat kellene kiadni. Ez a beállítás kevésbé biztonságos, mint az alapértelmezett ChainTrust. Az éles kód használata PeerOrChainTrust előtt alaposan meg kell fontolni ennek a beállításnak a biztonsági következményeit.

Az ügyfél-implementáció hozzáad egy hívást a IsCallerAnonymous metódushoz, máskülönben nem tér el a WSHttpBinding-mintától .

// Create a client with a client endpoint configuration.
CalculatorClient client = new CalculatorClient();

// Call the GetCallerIdentity operation.
Console.WriteLine("IsCallerAnonymous returned: {0}", client.IsCallerAnonymous());

// Call the Add service operation.
double value1 = 100.00D;
double value2 = 15.99D;
double result = client.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);

...

//Closing the client gracefully closes the connection and cleans up resources.
client.Close();

Console.WriteLine();
Console.WriteLine("Press <ENTER> to terminate client.");
Console.ReadLine();

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.

IsCallerAnonymous returned: True
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ág névtelen mintában található Setup.bat kötegfájl lehetővé teszi a kiszolgáló megfelelő tanúsítvánnyal 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 két módban futtatható. Ha egyszámítógépes módban szeretné futtatni a kötegfájlt, írja be setup.bat a parancssorba. A szolgáltatás módban való futtatásához írja be a következőt setup.bat service: . Ezt a módot akkor használja, ha a mintát számítógépeken futtatja. 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:

  • 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 beállítási kötegfájl egy szolgáltatás argumentumával (például setup.bat service) 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 kötegfá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 folyamat fiókjához.

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

Megjegyzés:

Ha a Windows nem amerikai angol kiadását használja, szerkesztenie kell a Setup.bat fájlt, és le kell cserélnie a NT AUTHORITY\NETWORK SERVICE fiók nevét a regionális megfelelőre.

A példa beállítása, elkészítése é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. Győződjön meg arról, hogy az elérési út tartalmazza azt a mappát, amelyben Makecert.exe és FindPrivateKey.exe találhatók.

  2. A Visual Studio fejlesztői parancssorban, amely rendszergazdai jogosultságokkal fut, futtassa a Setup.bat parancsot a minta telepítési mappából. Ez telepíti a minta futtatásához szükséges összes tanúsítványt.

    Megjegyzés:

    A beállítási 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.

  3. 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.

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

  5. 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 és Cleanup.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. Futtassa setup.bat service a kiszolgálón a Visual Studio fejlesztői parancssorában, amely rendszergazdai jogosultságokkal van megnyitva. A setup.bat argumentummal futtatott service 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 Web.config, hogy tükrözze az új tanúsítványnevet (a findValue<serviceCertificate> attribútumban), 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é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.

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

  10. Az ügyfélszámítógépen indítsa el a Client.exe parancssorbó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.

Megjegyzés:

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.