보안 키 삽입

보안 키 주입은 신뢰할 수 없는 클라이언트를 통해 서버 애플리케이션에서 스마트 카드로 중요한 자료를 암호화된 전송을 지원합니다. 보안 키 주입이 제대로 작동하려면 다음 단계를 수행해야 합니다.

  1. 암호화 키 설정:

    1. 서버와 클라이언트의 스마트 카드 간에 공유 대칭 키를 사용합니다.
    2. 서버에서 임시 대칭 세션 키를 생성하고 스마트 카드로 가져옵니다. 세션 키는 스마트 카드에 생성된 해당 프라이빗 키가 있는 공개 키로 암호화해야 합니다.
    3. 공유 대칭 키에서 세션 키를 파생시킵니다. 자세한 내용은 CardGetSharedKeyHandle을 참조하세요.
    4. DH 키 파생을 사용합니다.
  2. 서버의 데이터 암호화:

    1. 데이터는 PIN과 같은 인증 데이터일 수 있습니다.
    2. 데이터는 RSA/ECC와 같은 비대칭 키 쌍일 수 있습니다.
  3. 클라이언트의 스마트 카드에 있는 데이터의 암호 해독

다음 다이어그램에서는 키를 생성한 다음 트러스트 경계를 넘어 클라이언트로 안전하게 전송하는 서버 애플리케이션을 보여 줍니다. 키를 받은 후 클라이언트는 해당 키를 스마트 카드로 가져옵니다. 마지막 단계로, 보관을 위해 키를 CA로 가져옵니다. 암호화된 채널은 서버 애플리케이션과 스마트 카드 사이에 있어야 하며 클라이언트 애플리케이션/미니 드라이버는 암호화된 데이터에 액세스할 수 없어야 합니다.

overview of server-client interaction during a secure key injection with smart cards.

2단계에서 키를 암호화하려면 서버와 스마트 카드에 공유 대칭 키가 필요합니다.

보안 키 삽입을 수행할 때 독점 형식을 사용하는 기존 카드를 수용하기 위해 카드가 없는 서버 쪽에 미니 드라이버를 로드할 수 있습니다. 미니 드라이버는 메시지의 형식을 지정한 다음 마지막으로 암호화하여 클라이언트에서 실행되는 동일한 미니 드라이버가 메시지의 암호를 해독할 수 있도록 합니다.

다음 다이어그램에서는 미니 드라이버가 포함된 서버/클라이언트 키 보관에 대한 개요를 제공합니다.

overview of server/client key archival with minidrivers.

카드 키 핸들

대칭 키를 처리할 때 CARD_KEY_HANDLE 사용하여 키 핸들을 전달해야 합니다.

typedef ULONG_PTR  CARD_KEY_HANDLE;

카드 모드 없음

신뢰할 수 없는 클라이언트에 설치된 동일한 미니 드라이버를 사용하여 데이터 형식을 지정하고 암호화하는 서버 애플리케이션을 용이하게 하기 위해 카드가 없을 모드에서 CardAcquireContext 를 호출할 수 있습니다. 이 모드는 CardAcquireContextdwFlags 매개 변수에서 다음 플래그를 설정하여 활성화됩니다.

#define CARD_SECURE_KEY_INJECTION_NO_CARD_MODE  0x1

이 설정은 CardAcquireContext 가 판독기에서 어떤 카드도 기대하지 않도록 지시합니다. 즉 , CARD_DATA ATR 필드가 채워지지 않고 hSCardhSCardCtx 가 0으로 설정됩니다.

이 플래그가 설정되면 미니 드라이버는 다음 함수 호출만 수락할 수 있습니다.

보안 키 주입에 대한 사용 사례 시나리오

이 예제 시나리오에서 클라이언트 애플리케이션은 스마트 카드 소유자를 대신하여 서버에서 실행 중인 CA 애플리케이션에서 인증서를 발급할 것을 요청합니다. CA에는 키 보관도 필요합니다. 비대칭 키페어를 사용하여 임시 대칭 세션 키를 설정하는 방법에 대한 지침은 보안 키 삽입 섹션의 각주를 참조하세요.

사용자 키는 서버 쪽에서 생성되고, 보관된 다음, 보안 키 삽입 기능을 사용하여 사용자의 스마트 카드에 삽입됩니다. 다음 그림에서는 프로세스를 보여 줍니다.

process for key generation and insertion.

이 시나리오는 비대칭 키로 암호화된 대칭 세션 키를 가져온 다음 후속 키 래핑에 이 대칭 키를 사용하는 것을 기반으로 합니다.

다음 단계에서는 이전 그림과 같이 프로세스를 설명합니다.

  1. 클라이언트 애플리케이션은 서버에서 실행 중인 CA 애플리케이션에서 새 인증서를 요청합니다.

  2. 클라이언트의 요청을 받으면 서버 애플리케이션은 인증서 템플릿이 키 복구를 위해 구성되었음을 감지합니다. 결과적으로 서버 애플리케이션은 보안 키 삽입 프로토콜을 시작합니다.

  3. 클라이언트 애플리케이션은 CP_KEY_IMPORT_SUPPORT CardGetProperty 를 호출하여 다음을 검색합니다.

    • 카드가 보안 키 주입을 지원하는지 여부입니다.
    • 지원되는 대칭 키 가져오기 메서드입니다.
    • 지원되는 알고리즘입니다.
  4. 미니 드라이버는 클라이언트 애플리케이션에 비대칭 메커니즘(CARD_KEY_IMPORT_ASYMMETRIC_KEYEST)을 통한 키 삽입을 지원한다는 것을 나타냅니다.

  5. 클라이언트 애플리케이션은 스마트 카드의 컨테이너 맵 파일을 통해 키 가져오기에 유용한 컨테이너가 있는지 확인합니다. 없는 경우 클라이언트 애플리케이션은 CardCreateContainer 를 호출하여 새 키 쌍을 생성합니다.

  6. 미니 드라이버는 스마트 카드에 키 쌍을 만들도록 지시합니다.

  7. 스마트 카드는 키를 만든 후 미니 드라이버에 키를 반환합니다.

  8. 미니 드라이버는 키가 생성되었다는 표시를 클라이언트 애플리케이션에 반환합니다.

  9. 이제 클라이언트 애플리케이션은 CardGetContainerInfo 를 호출하여 6단계에서 만든 키 쌍의 공개 키를 내보냅니다.

  10. 카드 미니 드라이버는 공개 키를 반환하도록 카드에 지시합니다.

  11. 카드에서 공개 키(K1)를 추출하여 미니 드라이버로 반환합니다.

  12. 미니 드라이버는 클라이언트 애플리케이션에 K1을 반환합니다.

  13. 클라이언트 애플리케이션은 CardGetProperty 를 호출하여 카드에서 지원하는 대칭 알고리즘을 열거하고 K1과 함께 사용할 수 있는 패딩 체계를 열거합니다.

  14. 미니 드라이버는 지원되는 알고리즘 및 패딩 모드를 반환합니다.

  15. 클라이언트 애플리케이션은 카드에서 지원하는 대칭 키 알고리즘 및 패딩 모드를 설명하는 정보와 함께 K1을 서버 애플리케이션으로 다시 보냅니다.

  16. 서버 애플리케이션은 카드에서 지원하는 알고리즘 중 하나를 사용하여 대칭 키(S1)를 생성합니다. 대칭 키 S1은 K1로 암호화되어 클라이언트 애플리케이션으로 반환됩니다. 또한 서버 애플리케이션은 암호화 알고리즘 및 S1 암호화에 사용된 패딩 유형에 대한 정보를 반환합니다.

  17. 클라이언트 애플리케이션은 K1에 대한 참조 및 BLOB 암호 해독에 사용할 패딩 정보와 함께 암호화된 키 데이터 BLOB을 사용하여 CardImportSessionKey 를 호출합니다.

    주요 데이터 BLOB에 대한 자세한 내용은 BCRYPT_KEY_DATA_BLOB_HEADER 참조하세요.

  18. 미니 드라이버는 암호 해독을 위해 암호화된 BLOB 데이터를 스마트 카드에 전달합니다.

  19. 대칭 키의 암호를 해독한 후 스마트 카드는 대칭 키에 대한 참조를 미니 드라이버에 반환합니다.

  20. 미니 드라이버는 대칭 키에 대한 클라이언트 애플리케이션에 키 핸들을 반환합니다.

  21. 클라이언트 애플리케이션은 대칭 키를 가져온 서버 애플리케이션에 승인을 보냅니다.

  22. 서버 애플리케이션은 MDImportSessionKey를 호출하여 S1을 서버 쪽 미니 드라이버로 가져옵니다.

  23. 서버 쪽 미니 드라이버는 S1을 성공적으로 가져왔음을 나타내는 성공을 반환합니다.

  24. 서버 애플리케이션은 비대칭 키 쌍(K2)을 생성합니다. K2는 MDEncryptData를 호출하여 서버 쪽 미니 드라이버로 전송됩니다. 서버 애플리케이션은 IV 및 체인 모드를 생성하고 CardSetKeyProperty를 호출하여 이 정보를 서버 쪽 미니 드라이버로 설정합니다.

  25. 서버 쪽 미니 드라이버는 S1을 사용하여 K2를 암호화하고 암호화된 K2를 서버 애플리케이션에 반환합니다.

  26. 서버 애플리케이션은 암호화와 관련된 정보와 함께 encryptedK2를 클라이언트 애플리케이션에 보냅니다. 여기에는 IV 및 체인 모드 정보가 포함됩니다.

  27. 클라이언트 애플리케이션은 CardSetKeyProperty 를 호출하여 미니 드라이버에 S1과 함께 사용할 IV 및 체인 모드를 지시합니다. 그런 다음 클라이언트 애플리케이션은 다음 데이터를 사용하여 CardProcessEncryptedData 를 호출합니다.

    • K2를 포함하는 암호화된 키 데이터 BLOB입니다.
    • 카드가 데이터의 암호를 해독하고 키를 만들 수 있도록 S1에 대한 키 참조입니다.
  28. 미니 드라이버는 새 키 컨테이너를 준비하는 데 필요한 단계를 수행하고 암호화된 키 데이터 BLOB을 스마트 카드에 제공합니다.

  29. 스마트 카드는 S1을 사용하여 K2의 암호를 해독하고 K2에 대한 새 키 컨테이너를 생성합니다. 이 카드는 키를 가져왔음을 나타내는 성공을 반환합니다.

  30. 미니 드라이버는 CardProcessEncryptedData에서 성공을 반환합니다.

  31. 클라이언트 애플리케이션이 성공을 반환하고 프로세스가 완료되었습니다.