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

 

VS 2022 17.11.5버전 기준

1. 최신 NDK 다운로드

2. 원본 C:\Program Files (x86)\Android\AndroidNDK\android-ndk-r23c 백업 및 해당 경로에 최신 NDK 덮어 씌우기

3. 텍스트 편집기를 관리자 권한으로 실행 후, 아래 경로를 로드

C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Application Type\Android\3.0\Android.Common.props

isystem 문자열 검색 후, 아래 파란 라인을 삭제

VS 프로젝트 -> 속성페이지 -> C/C++ -> 명령줄 -> 모든 옵션에서 -isystem이 사라진 것을 확인

(최신 NDK와 호환되지 않는 경로 설정을 삭제)

4. 텍스트 편집기를 관리자 권한으로 실행 후, 아래 두 개의 경로를 로드

C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Application Type\Android\3.0\Platforms\ARM\PlatformToolsets\Clang_5_0\toolset.props

C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Application Type\Android\3.0\Platforms\ARM64\PlatformToolsets\Clang_5_0\toolset.props

lib64 문자열 검색 후, 아래처럼 lib\clang\18로 변경 (경로마다 각각 변경)

6. 빌드

'Windows > Dev' 카테고리의 다른 글

windows + mac 동시 개발 시 주의 사항  (0) 2024.10.15
[C++] 함수 const 선언 정리  (0) 2024.09.12
[MSVC] 클래스 고찰 & 디컴파일  (0) 2024.08.08
[VC++] 문자열 복사, 이동  (0) 2024.05.09
detours 빌드 및 적용  (0) 2024.04.11

1. windows에서 CRLF를 사용한다면, 맥에서도 CRLF로 변경해야함.

Xcode -> Settings -> Text Editing -> Editing -> Default Line Endings을 CRLF로 변경

2. 맥에서는 UTF8(BOM)을 지원하지 않으므로, windows에서 UTF8(BOM)으로 작업하고 있었다면 UTF8로 변경해줘야 함

이 두가지를 맞추지 않으면, git 작업 시 애로사항이 꽃 핀다.

+ Recent posts