Delen via


Beveiligde sleutelinjectie

Secure Key Injection biedt ondersteuning voor de versleutelde overdracht van gevoelig materiaal van een servertoepassing naar een smartcard via een niet-vertrouwde client. Om veilig sleutelinjectie goed te laten werken, moeten de volgende stappen worden uitgevoerd:

  1. Instelling van versleutelingssleutels:

    1. Gebruik gedeelde symmetrische sleutels tussen de server en de smartcard op de client.
    2. Genereer een tijdelijke symmetrische sessiesleutel op de server en importeer deze in de smartcard. De sessiesleutel moet worden versleuteld door een openbare sleutel waarop de bijbehorende persoonlijke sleutel is gegenereerd op de smartcard.
    3. Een sessiesleutel afleiden van een gedeelde symmetrische sleutel. Zie CardGetSharedKeyHandlevoor meer informatie.
    4. Gebruik DH-sleutelafleiding.
  2. Versleuteling van gegevens op de server:

    1. Gegevens kunnen verificatiegegevens zijn, zoals een pincode.
    2. Gegevens kunnen een asymmetrisch sleutelpaar zijn, zoals RSA/ECC.
  3. Ontsleuteling van gegevens in de smartcard op de client.

In het volgende diagram ziet u een servertoepassing die een sleutel genereert en vervolgens de sleutel veilig overdraagt over een vertrouwensgrens naar de client. Nadat de sleutel is ontvangen, importeert de client deze naar de smartcard. Als laatste stap wordt de sleutel geïmporteerd in de CA voor archivering. Er moet een versleuteld kanaal bestaan tussen de servertoepassing en de smartcard. De clienttoepassing/minidriver heeft geen toegang tot de versleutelde gegevens.

overzicht van server-clientinteractie tijdens een veilige sleutelinjectie met smartcards.

Als u de sleutel in stap 2 wilt versleutelen, hebben de server en de smartcard een gedeelde symmetrische sleutel nodig.

Voor bestaande kaarten die een eigen indeling gebruiken wanneer ze veilige sleutelinjectie uitvoeren, kan de minidriver aan de serverzijde worden geladen zonder dat de kaart aanwezig is. De minidriver formatteert het bericht en versleutelt het vervolgens, waardoor dezelfde minidriver die op de client wordt uitgevoerd, het bericht kan ontsleutelen.

Het volgende diagram biedt een overzicht van archivering van server-/clientsleutels met minidrivers.

overzicht van archivering van server-/clientsleutels met minidrivers.

kaartsleutelgreep

Bij het omgaan met symmetrische sleutels moet CARD_KEY_HANDLE worden gebruikt om de sleutelgreep door te geven.

typedef ULONG_PTR  CARD_KEY_HANDLE;

geen kaartmodus

Om servertoepassingen die gegevens opmaken en versleutelen mogelijk te maken met behulp van dezelfde minidriver die op de niet-vertrouwde client is geïnstalleerd, kan CardAcquireContext- worden aangeroepen in een modus waarvoor de kaart niet aanwezig hoeft te zijn. Deze modus wordt ingeschakeld door de volgende vlag in te stellen in de dwFlags-parameter parameter van CardAcquireContext.

#define CARD_SECURE_KEY_INJECTION_NO_CARD_MODE  0x1

Deze instelling instruéert CardAcquireContext dat er niet verwacht wordt dat er een kaart in de lezer is. Dit betekent dat de ATR-velden in de CARD_DATA niet zijn ingevuld en hSCard- en hSCardCtx- zijn ingesteld op nul.

Wanneer deze vlag is ingesteld, kan de minidriver alleen de volgende functie-aanroepen accepteren:

usecasescenario voor veilige sleutelinjectie

In dit voorbeeldscenario vraagt een clienttoepassing aan dat een certificaat wordt uitgegeven vanuit de CA-toepassing die wordt uitgevoerd op een server namens de eigenaar van de smartcard. De CA vereist ook sleutelarchivering. Raadpleeg de voetnoot in de sectie "Secure Key Injection" voor advies over het gebruik van een asymmetrisch sleutelpaar om tijdelijke symmetrische sessiesleutels tot stand te brengen.

De gebruikerssleutel wordt gegenereerd aan de serverzijde, gearchiveerd en vervolgens geïnjecteerd in de smartcard van de gebruiker met behulp van functies voor veilig sleutelinjectie. In de volgende afbeelding ziet u het proces.

proces voor het genereren en invoegen van sleutels.

Dit scenario is gebaseerd op het importeren van een symmetrische sessiesleutel die is versleuteld met een asymmetrische sleutel en deze symmetrische sleutel vervolgens gebruikt voor volgende sleutelterugloop.

In de volgende stappen wordt het proces beschreven, zoals wordt weergegeven in de vorige afbeelding:

  1. De clienttoepassingen vragen een nieuw certificaat aan bij een CA-toepassing die op de server wordt uitgevoerd.

  2. Wanneer de aanvraag van de client wordt ontvangen, detecteert de servertoepassing dat de certificaatsjabloon is geconfigureerd voor sleutelherstel. Als gevolg hiervan initieert de servertoepassing het protocol voor veilige sleutelinjectie.

  3. De clienttoepassing roept CardGetProperty- aan om CP_KEY_IMPORT_SUPPORT het volgende te detecteren:

    • Of de kaart veilige sleutelinjectie ondersteunt.
    • Welke methode voor het importeren van symmetrische sleutels wordt ondersteund.
    • Welke algoritmen worden ondersteund.
  4. De minidriver geeft aan aan de clienttoepassing dat het ondersteuning biedt voor sleutelinjectie via het asymmetrische mechanisme (CARD_KEY_IMPORT_ASYMMETRIC_KEYEST).

  5. De clienttoepassing kijkt door het containertoewijzingsbestand van de smartcard om te zien of containers nuttig zijn voor het importeren van sleutels. Als er geen wordt gevonden, roept de clienttoepassing CardCreateContainer aan om een nieuw sleutelpaar te genereren.

  6. De minidriver geeft de smartcard opdracht om een sleutelpaar te maken.

  7. De smartcard retourneert de sleutel aan de minidriver nadat de sleutel is gemaakt.

  8. De minidriver geeft een indicatie aan de clienttoepassing dat de sleutel is gegenereerd.

  9. De clienttoepassing roept nu CardGetContainerInfo- aan om de openbare sleutel te exporteren van het sleutelpaar dat in stap 6 is gemaakt.

  10. De minidriver geeft de kaart opdracht om de openbare sleutel te retourneren.

  11. De kaart extraheert de openbare sleutel (K1) uit de kaart en stuurt deze terug naar de minidriver.

  12. De minidriver retourneert K1 naar de clienttoepassing.

  13. De clienttoepassing roept CardGetProperty- aan om de symmetrische algoritmen op te sommen die door de kaart worden ondersteund, en om de opvullingsschema's op te sommen die met K1 kunnen worden gebruikt.

  14. De minidriver retourneert de algoritmen en opvullingsmodi die worden ondersteund.

  15. De clienttoepassing stuurt K1 terug naar de servertoepassing, samen met de informatie die de symmetrische sleutelalgoritmen en opvullingsmodi beschrijft die door de kaart worden ondersteund.

  16. Door een van de algoritmen te gebruiken die door de kaart worden ondersteund, genereert de servertoepassing een symmetrische sleutel (S1). De symmetrische sleutel S1 wordt versleuteld met K1 en geretourneerd naar de clienttoepassing. De servertoepassing retourneert ook informatie over het versleutelingsalgoritmen en het type opvulling dat is gebruikt voor het versleutelen van S1.

  17. De clienttoepassing roept CardImportSessionKey aan met een blob met versleutelde sleutelgegevens, samen met de verwijzing naar K1 en eventuele opvullingsgegevens die moeten worden gebruikt om de BLOB te ontsleutelen.

    Voor meer informatie over sleutelgegevens-BLOBs, zie BCRYPT_KEY_DATA_BLOB_HEADER.

  18. De minidriver geeft de versleutelde BLOB-gegevens door aan de smartcard voor ontsleuteling.

  19. Nadat de symmetrische sleutel is ontsleuteld, retourneert de smartcard een verwijzing naar de symmetrische sleutel naar de minidriver.

  20. De minidriver retourneert een sleutelgreep naar de clienttoepassing voor de symmetrische sleutel.

  21. De clienttoepassing verzendt een bevestiging naar de servertoepassing die de symmetrische sleutel heeft geïmporteerd.

  22. De servertoepassing importeert S1 naar de minidriver aan de serverzijde door MDImportSessionKeyaan te roepen.

  23. De minidriver aan de serverzijde geeft succes terug om aan te geven dat S1 succesvol is geïmporteerd.

  24. De servertoepassing genereert het asymmetrische sleutelpaar (K2). K2 wordt naar de minidriver aan de serverzijde verzonden door MDEncryptDataaan te roepen. De servertoepassing genereert de IV en de ketenmodus en stelt deze gegevens in op de minidriver aan de serverzijde door CardSetKeyPropertyaan te roepen.

  25. De minidriver aan de serverzijde versleutelt K2 met behulp van S1 en retourneert de versleutelde K2 naar de servertoepassing.

  26. De servertoepassing verzendt de versleuteldeK2 naar de clienttoepassing, samen met alle informatie die betrekking heeft op de versleuteling. Dit omvat de informatie over de iv- en ketenmodus.

  27. De clienttoepassing roept CardSetKeyProperty aan om de minidriver te instrueren welke IV en kettingmodus er moeten worden gebruikt met de S1. De clienttoepassing roept vervolgens CardProcessEncryptedData- aan met de volgende gegevens:

    • De versleutelde sleutelgegevens-BLOB die K2 bevat.
    • De sleutelreferentie naar S1, zodat de kaart de gegevens kan ontsleutelen en de sleutel kan maken.
  28. De minidriver voert de benodigde stappen uit om een nieuwe sleutelcontainer voor te bereiden en geeft de versleutelde sleutelgegevens-BLOB aan de smartcard.

  29. De smartcard ontsleutelt K2 met behulp van S1 en genereert een nieuwe sleutelcontainer voor K2. De kaart retourneert succes om aan te geven dat de sleutel is geïmporteerd.

  30. De minidriver retourneert succes van CardProcessEncryptedData.

  31. De clienttoepassing retourneert succes en het proces is voltooid.