예제 참조 : https://github.com/codetronik/KeyStoreExample

아래 코드를 실행하면, certificateChain에 인증서 체인이 저장된다.

val kpg = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore")

kpg.initialize(
		KeyGenParameterSpec.Builder(SIGN_KEY_ALIAS, KeyProperties.PURPOSE_SIGN or KeyProperties.PURPOSE_VERIFY)
			.setAttestationChallenge(challenge)
			.setIsStrongBoxBacked(isStrongBoxSupported())
			.build())

kpg.generateKeyPair()

val certificateChain = keyStore.getCertificateChain(SIGN_KEY_ALIAS)

인증서는 총 4개(리프, 중간-1, 중간-2, 루트 순)로 구성되어 있다. (구형 기기는 다름)

루트 인증서는 고정이며, 중간 인증서 2개는 발급자가 기기마다.. ?? (같은 모델에서 확인 필요)

루트 인증서의 공개키는 https://developer.android.com/privacy-and-security/security-key-attestation?hl=ko#root_certificate에서 제공하는 것과 일치한다. 이 키로 루트 인증서 및 중간-2 인증서를 검증한다.

만약, vendor로부터 직접 전달받은 출시 전 테스트폰이라면, 구글 루트 인증서가 아닌, 벤더 루트 인증서일 확률이 높다.

중간-2 인증서로 중간-1 인증서를 검증한다.

중간-1 인증서로 리프 인증서를 검증한다.

리프 인증서에는 확장 OID 1.3.6.1.4.1.11129.2.1.17 가 존재하며, 기기증명 콘텐츠가 포함되어 있다.

각 항목에 대한 설명은 아래 링크에 참고

https://source.android.com/docs/security/features/keystore/attestation?hl=ko

https://developer.android.com/privacy-and-security/security-key-attestation?hl=ko

아래는 나의 갤럭시 S20 노트에서 확인한 기기증명 콘텐츠이다.

이름 비고
attestationVersion  3 키마스터2 = 1, 키마스터3 = 2, 키마스터4 = 3
attestationSecurityLevel 2 SW = 0, TEE = 1, StrongBox = 2
keymasterVersion 4  
keymasterSecurityLevel 4 SW = 0, TEE = 1, StrongBox = 2
attestationChallenge 챌린지 키쌍 생성 시 설정한 챌린지
uniqueId 없음  
softwareEnforced    
- creationDateTime 3810012308008 콘텐츠 생성 시간
- attestationApplicationId HEX값 앱 패키지 이름 및 앱을 서명한 인증서의 서명 값(SHA-256)
teeEnforced    
- purpose 2, 3 SIGN = 2, VERIFY = 3
- algorithm 3 RSA = 1, EC = 3
- keySize 256  
- ecCurve 1 P_256 = 1, P_384 = 2, P_512 = 3
- noAuthRequired true  
- origin 0 키가 생성된 위치 (생성 = 0, 유도 = 1, 임포트 = 2, 모름 = 3)
- rootOfTrust    
-- verifiedBootKey HEX값  
-- deviceLocked true 부트로더 잠김 여부
-- verifiedBootState 0 검증됨 = 0, 자체 서명 = 1, 검증 안됨 = 2, 실패 = 3
-- verifiedBootHash HEX값  
- osVersion 130000 Android 13
- osPatchLevel 202410 키마스터 보안 패치 날짜
- vendorPatchLevel 20241001 기기의 증명키 생성 날짜
- bootPatchLevel 20241001 기기의 증명키 생성 날짜

 

+ Recent posts