HSM 관련

PKCS#11이란?

crypsec 2024. 10. 23. 21:37
반응형

PKCS#11(암호화 표준 #11)은 암호화 장치(예: 하드웨어 보안 모듈, 스마트카드, USB 토큰 등)와 소프트웨어 애플리케이션 간에 암호화 작업을 표준화된 방법으로 수행할 수 있도록 하는 API 규격이다. 이 표준은 RSA Security에서 개발한 Public Key Cryptography Standards (PKCS) 시리즈 중 하나이며, "Cryptographic Token Interface Standard"라고도 불린다.  PKCS#11를 Cryptoki라고도 부르는데 Cryptographic Token Interface를 줄여서 만든 글자다.
 
PKCS#11은 암호화 토큰(crypto tokens, HSM, 스마트카드 등)이 제공하는 보안 서비스에 접근하는 방법을 정의하는데, 주로 키 관리, 디지털 서명, 데이터 암호화/복호화 등의 암호화 작업을 안전하게 수행하는 데 사용된다.
 
근데 사실 이렇게 보기만 하면 이해가 안 되는 게 당연하다. 그래서 PKCS#11이라는 프로그램이 있다는 건가? 제품이 있다는 건가.. 확실하게는 "우리 PKCS#11이라는 규칙에 적혀있는 API로만 기능을 제공하자"이다.
마지막으로 정리하자면 암호화 장치와 소프트웨어 간의 상호작용을 정의한 표준 규격(API)이다. 즉, 어떤 소프트웨어나 하드웨어가 PKCS#11을 준수하는 방식으로 기능을 제공할 수 있다는 것을 의미한다. PKCS#11 자체는 규칙과 인터페이스 사양을 의미하며, 다양한 암호화 장치나 라이브러리들이 이 규격을 따르는 방식으로 구현되어 있다.(비록 ISO 같은 국제 표준화 기구에서 정한 건 아니지만 사실상 표준처럼 쓰고 있다. 그래서 아마 대부분의 HSM는 PKCS#11 API만으로 사용이 가능하다. 사용 가능하게 만든다가 정답이겠다.)
 
현재는 oasis라는 단체에서 이를 업데이트하고 있는데
https://www.oasis-open.org/ 해당 사이트에서 잘 찾아보면 PKCS#11에 대한 정보를 찾을 수 있다.
API코드는 https://docs.oasis-open.org/pkcs11/pkcs11-base/v3.0/os/pkcs11-base-v3.0-os.html 를 기준으로 한다.
문서 버전이 2.4도 있는데 이건 url 알아서 잘 수정해서 들어가면 된다.
 
문서 일부를 보자면

그냥 C언어 구조체를 정의하고 있다. 즉, 이렇게 정해줄 테니까 이런 기능에는 이런 변수를 사용하라는 게 엄청 많다.
그럼 이걸 실제로 구현하면 된다. 근데 이걸 어느 세월에 구현하고 있나.. 이미 되어있다. 이해하고 가져다 쓰면 된다.
https://github.com/oasis-tcs/pkcs11

GitHub - oasis-tcs/pkcs11: OASIS PKCS 11 TC: Repository to support version control for development of technical files associated

OASIS PKCS 11 TC: Repository to support version control for development of technical files associated with the OASIS PKCS11 specification - oasis-tcs/pkcs11

github.com

여기서 header 파일들을 정의하고 있다.
https://github.com/oasis-tcs/pkcs11/blob/master/published/3-01/pkcs11t.h 에서 위의 문서에서 정의한 구조체를 그대로 구현해 놓은 것을 볼 수 있다.

 
그렇다면 이거는?

마찬가지로 코드로 그대로 정의되어 있다.

즉, 이를 이해하고 가져다 쓰기만 하면 된다.
 
좀 더 자세한? 설명은 우리 ChatGPT 님이 정리해 주셨다. 굳이 틀린 내용은 없어서 접는 글로 놔둔다.

더보기

PKCS#11의 주요 목적

  1. 하드웨어 장치에 대한 추상화 제공: PKCS#11은 HSM, 스마트 카드, 보안 USB 등 다양한 암호화 장치에서 동일한 API로 암호화 작업을 처리할 수 있도록 하여, 하드웨어에 종속되지 않고 다양한 장치를 지원할 수 있습니다.
  2. 키 관리 및 보안 작업 지원: 암호화 키를 안전하게 생성, 저장, 삭제하는 작업을 수행하며, 이 키들은 HSM과 같은 안전한 장치에 저장될 수 있습니다.
  3. 소프트웨어와 하드웨어 간의 상호작용 표준화: 소프트웨어 애플리케이션이 하드웨어 암호화 장치와 통신할 수 있도록 도와줍니다. 이를 통해 애플리케이션은 보안 장치에 저장된 키로 암호화 및 복호화를 수행할 수 있습니다.

PKCS#11의 특징

  1. 키 관리:
    • 키 생성, 가져오기, 내보내기, 삭제 등의 작업을 안전하게 수행할 수 있습니다.
    • 비대칭(공개/개인) 키, 대칭 키, 디지털 인증서와 같은 암호화 객체들을 관리합니다.
  2. 암호화 및 복호화:
    • 대칭 및 비대칭 암호화 알고리즘을 지원하여 데이터를 안전하게 암호화하고 복호화할 수 있습니다.
    • RSA, AES, DES, 3DES 등의 알고리즘을 지원합니다.
  3. 디지털 서명 및 검증:
    • PKCS#11은 HSM이나 스마트 카드에 저장된 개인 키를 사용하여 데이터에 디지털 서명을 하고, 이를 검증하는 기능을 제공합니다.
  4. 보안성:
    • 키는 외부에서 접근할 수 없는 하드웨어 장치 내에서 생성되고 사용되므로, 외부에 노출되지 않으며 보안성이 강화됩니다.
    • 키 관리 및 암호화 작업을 안전하게 수행할 수 있는 강력한 보안 장치를 활용할 수 있습니다.
  5. 멀티 플랫폼 지원:
    • PKCS#11은 리눅스, 윈도우, macOS 등 여러 플랫폼에서 지원되며, 다양한 하드웨어 장치에서 일관된 API를 사용할 수 있도록 설계되었습니다.

PKCS#11 사용 사례

  1. 하드웨어 보안 모듈(HSM): 은행, 정부기관, 대기업 등에서 암호화 키를 안전하게 관리하기 위해 HSM을 사용하고, PKCS#11 API를 통해 소프트웨어와 통신합니다.
  2. 스마트 카드 및 보안 토큰: PKCS#11을 사용하여 스마트 카드에 저장된 인증서를 기반으로 디지털 서명, 인증, 암호화 작업을 수행할 수 있습니다.
  3. SSL/TLS 서버: SSL/TLS 서버는 서버 인증서의 개인 키를 HSM에 안전하게 저장하고, PKCS#11을 통해 암호화 작업을 수행하여 키를 외부로 노출시키지 않습니다.

PKCS#11의 구성

PKCS#11 표준은 주로 다음과 같은 요소들로 구성됩니다:

  1. 슬롯(Slot): 하드웨어 장치(예: HSM, 스마트 카드 리더기) 하나를 나타냅니다. 시스템에 여러 슬롯이 있을 수 있으며, 각각의 슬롯에 보안 토큰이 연결될 수 있습니다.
  2. 토큰(Token): 암호화 키와 인증서를 포함한 보안 객체들이 저장된 실제 보안 장치입니다. 슬롯에 연결된 장치로 암호화 작업을 수행합니다.
  3. 세션(Session): 애플리케이션이 PKCS#11을 사용하여 장치와 통신할 때 열리는 논리적 연결입니다. 세션을 통해 암호화, 서명, 키 관리 등의 작업을 수행합니다.
  4. 객체(Object): 키, 인증서, 데이터 등의 암호화 자료를 나타냅니다. PKCS#11을 통해 관리되고, 토큰 안에 저장됩니다.

PKCS#11 API의 기본 흐름

  1. 라이브러리 초기화: C_Initialize() 함수로 PKCS#11 라이브러리를 초기화합니다.
  2. 슬롯 및 토큰 검색: C_GetSlotList() 함수로 사용 가능한 슬롯 목록을 얻고, C_GetTokenInfo()로 슬롯에 있는 토큰 정보를 확인합니다.
  3. 세션 열기: C_OpenSession()을 통해 세션을 엽니다.
  4. 로그인: C_Login()으로 토큰에 로그인하여 권한을 얻습니다.
  5. 암호화 작업 수행: C_Encrypt(), C_Sign() 등의 API를 사용하여 암호화 작업을 수행합니다.
  6. 세션 종료 및 라이브러리 종료: C_CloseSession()과 C_Finalize()로 세션과 라이브러리를 종료합니다.

PKCS#11은 다양한 보안 장치와의 상호작용을 표준화하여, 안전한 키 관리 및 암호화 작업을 수행할 수 있도록 해줍니다.

 
그럼 마지막으로 다른 pkcs#11을 구현한 코드들에서도 저렇게 썼을까?라는 의문이 들 수 있다. 사실 내가 그랬어서 다 찾아서 하나하나 비교해 봤다. 구현 방식이 다르긴 한데 결국 똑같더라는게 내 결론이다.
 
OpenSC라는 스마트카드보안 토큰과 같은 하드웨어 보안 장치를 지원하는 오픈 소스 소프트웨어 프로젝트가 있는데 PKCS#11과 같은 표준을 준수한다. 그래서 여기에서 정의한 PKCS#11 헤더파일을 하나 예시로 보면 될 것 같다.
https://github.com/OpenSC/OpenSC/blob/master/src/pkcs11/pkcs11.h
 

헤더파일의 일부를 가져왔다. 애네가 직접 구현한듯한데, 의문이 들 거다. "같은 API를 제공해서 다른 곳에서도 똑같은 PKCS#11 코드를 가져와서 쓸 수 있어야 하는데 위에 공식 코드랑은 다른 거 아니야?" 근데 코드를 잘 뒤져보면 #define 매크로로 다음과 같은 정의들이 마구 나오는 것을 볼 수 있다.

1
2

 
이러고 다시 보면 결국 같은 헤더파일이 된다. 즉, 특정 기능을 제공하기 위한 세부적인 코드는 다를 수 있어도 사용자가 사용하는 데이터, 변수, 함수 모든 게 같다. 이는 예를 들자면 구글의 HSM에서 제공하는 기능을 PKCS#11에 따라 구현해 두면 애플의 HSM에서도 사용이 가능할 것이라는 말이 된다. 즉, 이식성이 매우 뛰어나다는 거다.
 
Reference?
https://thalesdocs.com/gphsm/ptk/5.9/docs/Content/PTK-C_Program/intro_PKCS11.htm

An Introduction to PKCS#11

An Introduction to PKCS#11 The PKCS#11 Cryptographic Token Interface Standard, also known as Cryptoki, is one of the Public Key Cryptography Standards developed by RSA Security. PKCS#11 defines the interface between an application and a cryptographic devic

thalesdocs.com

 
 
 
 

반응형