기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
corePKCS11 라이브러리 이식
퍼블릭 키 암호화 표준 #11은 암호화 토큰을 관리하고 사용하기 위한 플랫폼 독립적 API를 정의합니다. PKCS 11
FreeRTOS 라이브러리 및 참조 통합은 비대칭 키, 난수 생성 및 해싱 관련 작업 중심으로 PCKS #11 인터페이스 표준의 일부만 사용합니다. 아래 표에는 사용 사례 및 지원해야 하는 필수 PKCS #11 API가 나와 있습니다.
사용 사례 | 필수 PKCS #11 API 제품군 |
---|---|
모두 | Initialize, Finalize, Open/Close Session, GetSlotList, Login |
프로비저닝 | GenerateKeyPair, CreateObject, DestroyObject, InitToken, GetTokenInfo |
TLS | Random, Sign, FindObject, GetAttributeValue |
FreeRTOS+TCP | Random, Digest |
OTA | Verify, Digest, FindObject, GetAttributeValue |
전체 PKCS #11 모듈을 구현해야 하는 시기
범용 플래시 메모리에 프라이빗 키를 저장하면 평가 및 신속한 프로토타입 생성 시나리오에서 편리할 수 있습니다. 프로덕션 시나리오에서는 데이터 도용 및 디바이스 복제의 위협을 줄이기 위해 전용 암호화 하드웨어를 사용하는 것이 좋습니다. 암호화 하드웨어에는 암호화 비밀 키의 내보내기를 방지하는 기능이 있는 구성 요소가 포함됩니다. 이를 지원하려면 위 표에 정의된 대로 FreeRTOS 라이브러리와 함께 작동하는 데 필요한 PKCS #11의 하위 집합을 구현해야 합니다.
FreeRTOS corePKCS11을 사용해야 하는 시기
corePKCS11 라이브러리에는 Mbed TLS
corePKCS11 이식
온보드 플래시 메모리와 같은 비휘발성 메모리(NVM)에 암호화 객체를 읽고 쓸 수 있는 구현이 있어야 합니다. 암호화 객체는 초기화되지 않고 디바이스 재프로그래밍 시에도 지워지지 않는 NVM 섹션에 저장해야 합니다. corePKCS11 라이브러리 사용자는 디바이스에 보안 인증 정보를 제공한 다음, corePKCS11 인터페이스를 통해 이러한 보안 인증 정보에 액세스하는 새 애플리케이션으로 디바이스를 다시 프로그래밍합니다. corePKCS11 PAL 포트는 다음 항목의 저장 위치를 제공해야 합니다.
-
디바이스 클라이언트 인증서
-
디바이스 클라이언트 프라이빗 키
-
디바이스 클라이언트 퍼블릭 키
-
신뢰할 수 있는 루트 CA
-
보안 부트 로더 및 무선 업데이트(OTA)를 위한 코드 확인 퍼블릭 키(또는 코드 확인 퍼블릭 키를 포함하는 인증서)
-
JIT 프로비저닝 인증서
헤더 파일
함수 | 설명 |
---|---|
PKCS11_PAL_Initialize |
PAL 계층을 초기화합니다. 초기화 시퀀스의 시작 부분에서 corePKCS11 라이브러리에 의해 호출됩니다. |
PKCS11_PAL_SaveObject |
비휘발성 스토리지에 데이터를 씁니다. |
PKCS11_PAL_FindObject |
PKCS #11 |
PKCS11_PAL_GetObjectValue |
핸들이 지정된 객체의 값을 가져옵니다. |
PKCS11_PAL_GetObjectValueCleanup |
|
테스트
FreeRTOS corePKCS11 라이브러리를 사용하거나 PKCS11 API 중 필요한 하위 집합을 구현하는 경우 FreeRTOS PKCS11 테스트를 통과해야 합니다. 이를 통해 FreeRTOS 라이브러리의 필수 함수가 예상대로 작동하는지 테스트됩니다.
또한 이 섹션에서는 검증 테스트를 사용하여 로컬에서 FreeRTOS PKCS11 테스트를 실행하는 방법을 설명합니다.
필수 조건
FreeRTOS PKCS11 테스트를 설정하려면 다음을 구현해야 합니다.
지원되는 PKCS11 API 포트.
다음을 포함하는 FreeRTOS 검증 테스트 플랫폼 함수의 구현:
FRTest_ThreadCreate
FRTest_ThreadTimedJoin
FRTest_MemoryAlloc
FRTest_MemoryFree
(GitHub에서 PKCS #11 FreeRTOS 라이브러리 통합 테스트에 대한 README.md
이식 테스트
FreeRTOS-Libraries-Integration-Tests
를 하위 모델로 프로젝트에 추가합니다. 하위 모듈은 빌드가 가능하다면 프로젝트의 어느 디렉터리에든 배치할 수 있습니다. config_template/test_execution_config_template.h
및config_template/test_param_config_template.h
를 빌드 경로의 프로젝트 위치에 복사하고 이름을test_execution_config.h
및test_param_config.h
로 바꿉니다.관련 파일을 빌드 시스템에 포함합니다.
CMake
를 사용하는 경우 관련 파일을 포함하는 데src/pkcs11_tests.cmake
및qualification_test.cmake
를 사용할 수 있습니다.테스트 출력 로그와 디바이스 로그가 인터리브되지 않도록
UNITY_OUTPUT_CHAR
을 구현합니다.cryptoki 작업 결과를 검증하는 MbedTLS를 통합합니다.
애플리케이션에서
RunQualificationTest()
를 직접 호출합니다.
테스트 구성
PKCS11 테스트 제품군은 PKCS11 구현에 따라 구성되어야 합니다. 다음 표에는 test_param_config.h
헤더 파일에 있는 PKCS11 테스트에 필요한 구성이 나와 있습니다.
구성 | 설명 |
---|---|
PKCS11_TEST_RSA_KEY_SUPPORT |
이식이 RSA 키 기능을 지원합니다. |
PKCS11_TEST_EC_KEY_SUPPORT |
이식이 EC 키 기능을 지원합니다. |
PKCS11_TEST_IMPORT_PRIVATE_KEY_SUPPORT |
이식이 프라이빗 키 가져오기를 지원합니다. 지원되는 키 기능이 활성화된 경우 테스트에서 RSA 및 EC 키 가져오기가 검증됩니다. |
PKCS11_TEST_GENERATE_KEYPAIR_SUPPORT |
이식이 키 페어 생성을 지원합니다. 지원되는 키 기능이 활성화된 경우 테스트에서 EC 키 페어 생성이 검증됩니다. |
PKCS11_TEST_PREPROVISIONED_SUPPORT |
이식에 보안 인증 정보가 사전 프로비저닝되어 있습니다. |
PKCS11_TEST_LABEL_DEVICE_PRIVATE_KEY_FOR_TLS |
테스트에 사용되는 프라이빗 키의 레이블입니다. |
PKCS11_TEST_LABEL_DEVICE_PUBLIC_KEY_FOR_TLS |
테스트에 사용되는 퍼블릭 키의 레이블입니다. |
PKCS11_TEST_LABEL_DEVICE_CERTIFICATE_FOR_TLS |
테스트에 사용되는 인증서의 레이블입니다. |
PKCS11_TEST_JITP_CODEVERIFY_ROOT_CERT_SUPPORTED |
이식이 JITP용 스토리지를 지원합니다. JITP |
PKCS11_TEST_LABEL_CODE_VERIFICATION_KEY |
JITP |
PKCS11_TEST_LABEL_JITP_CERTIFICATE |
JITP |
PKCS11_TEST_LABEL_ROOT_CERTIFICATE |
JITP |
FreeRTOS 라이브러리 및 참조 통합은 RSA 또는 타원 곡선 키와 같은 최소 하나의 키 기능 구성과 PKCS11 API에서 지원하는 하나의 키 프로비저닝 메커니즘을 지원해야 합니다. 테스트는 다음과 같은 구성을 활성화해야 합니다.
다음 키 기능 구성 중 하나 이상:
PKCS11_TEST_RSA_KEY_SUPPORT
PKCS11_TEST_EC_KEY_SUPPORT
다음 키 프로비저닝 구성 중 하나 이상:
PKCS11_TEST_IMPORT_PRIVATE_KEY_SUPPORT
PKCS11_TEST_GENERATE_KEYPAIR_SUPPORT
PKCS11_TEST_PREPROVISIONED_SUPPORT
사전 프로비저닝된 디바이스 보안 인증 정보 테스트는 다음 조건에서 실행되어야 합니다.
PKCS11_TEST_PREPROVISIONED_SUPPORT
는 활성화되고 다른 프로비저닝 메커니즘은 비활성화해야 합니다.키 기능이
PKCS11_TEST_RSA_KEY_SUPPORT
또는PKCS11_TEST_EC_KEY_SUPPORT
중 하나만 활성화됩니다.PKCS11_TEST_LABEL_DEVICE_PRIVATE_KEY_FOR_TLS
,PKCS11_TEST_LABEL_DEVICE_PUBLIC_KEY_FOR_TLS
,PKCS11_TEST_LABEL_DEVICE_CERTIFICATE_FOR_TLS
를 포함하여 키 기능에 따라 사전 프로비저닝된 키 레이블을 설정합니다. 테스트를 실행하기 전에 이러한 보안 인증 정보가 있어야 합니다.
구현이 사전 프로비저닝된 보안 인증 정보 및 기타 프로비저닝 메커니즘을 지원하는 경우 테스트를 다른 구성으로 여러 번 실행해야 할 수 있습니다.
참고
PKCS11_TEST_GENERATE_KEYPAIR_SUPPORT
또는 PKCS11_TEST_GENERATE_KEYPAIR_SUPPORT
가 활성화되면 테스트 중에 PKCS11_TEST_LABEL_DEVICE_PRIVATE_KEY_FOR_TLS
, PKCS11_TEST_LABEL_DEVICE_PUBLIC_KEY_FOR_TLS
및 PKCS11_TEST_LABEL_DEVICE_CERTIFICATE_FOR_TLS
레이블을 가진 객체가 삭제됩니다.
테스트 실행
이 섹션에서는 검증 테스트를 사용하여 로컬에서 PKCS11 인터페이스를 테스트하는 방법을 설명합니다. 또는 IDT를 사용하여 실행을 자동화할 수도 있습니다. 자세한 내용은 FreeRTOS 사용 설명서의 FreeRTOS용 AWS IoT Device Tester를 참조하세요.
다음 지침에서는 테스트 실행 방법을 설명합니다.
test_execution_config.h
를 열고 CORE_PKCS11_TEST_ENABLED를 1로 정의합니다.애플리케이션을 빌드하고 디바이스에 플래시하여 실행합니다. 테스트 결과가 직렬 포트로 출력됩니다.
다음은 출력된 테스트 결과의 예입니다.
TEST(Full_PKCS11_StartFinish, PKCS11_StartFinish_FirstTest) PASS TEST(Full_PKCS11_StartFinish, PKCS11_GetFunctionList) PASS TEST(Full_PKCS11_StartFinish, PKCS11_InitializeFinalize) PASS TEST(Full_PKCS11_StartFinish, PKCS11_GetSlotList) PASS TEST(Full_PKCS11_StartFinish, PKCS11_OpenSessionCloseSession) PASS TEST(Full_PKCS11_Capabilities, PKCS11_Capabilities) PASS TEST(Full_PKCS11_NoObject, PKCS11_Digest) PASS TEST(Full_PKCS11_NoObject, PKCS11_Digest_ErrorConditions) PASS TEST(Full_PKCS11_NoObject, PKCS11_GenerateRandom) PASS TEST(Full_PKCS11_NoObject, PKCS11_GenerateRandomMultiThread) PASS TEST(Full_PKCS11_RSA, PKCS11_RSA_CreateObject) PASS TEST(Full_PKCS11_RSA, PKCS11_RSA_FindObject) PASS TEST(Full_PKCS11_RSA, PKCS11_RSA_GetAttributeValue) PASS TEST(Full_PKCS11_RSA, PKCS11_RSA_Sign) PASS TEST(Full_PKCS11_RSA, PKCS11_RSA_FindObjectMultiThread) PASS TEST(Full_PKCS11_RSA, PKCS11_RSA_GetAttributeValueMultiThread) PASS TEST(Full_PKCS11_RSA, PKCS11_RSA_DestroyObject) PASS TEST(Full_PKCS11_EC, PKCS11_EC_GenerateKeyPair) PASS TEST(Full_PKCS11_EC, PKCS11_EC_CreateObject) PASS TEST(Full_PKCS11_EC, PKCS11_EC_FindObject) PASS TEST(Full_PKCS11_EC, PKCS11_EC_GetAttributeValue) PASS TEST(Full_PKCS11_EC, PKCS11_EC_Sign) PASS TEST(Full_PKCS11_EC, PKCS11_EC_Verify) PASS TEST(Full_PKCS11_EC, PKCS11_EC_FindObjectMultiThread) PASS TEST(Full_PKCS11_EC, PKCS11_EC_GetAttributeValueMultiThread) PASS TEST(Full_PKCS11_EC, PKCS11_EC_SignVerifyMultiThread) PASS TEST(Full_PKCS11_EC, PKCS11_EC_DestroyObject) PASS ----------------------- 27 Tests 0 Failures 0 Ignored OK
모든 테스트가 통과되면 테스트가 완료됩니다.
참고
FreeRTOS용 디바이스를 공식적으로 인증하려면 AWS IoT Device Tester를 사용하여 디바이스의 이식된 소스 코드를 검증해야 합니다. FreeRTOS 사용 설명서의 FreeRTOS용 AWS IoT Device Tester 사용에 나와 있는 지침에 따라 포트 검증을 위해 AWS IoT Device Tester를 설정합니다. 특정 라이브러리의 포트를 테스트하려면 AWS IoT Device Tester configs
폴더의 device.json
파일에서 올바른 테스트 그룹을 활성화해야 합니다.