예제 참조 : 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 | 기기의 증명키 생성 날짜 |