키 증명으로 하드웨어 지원 키 쌍 확인

키 증명은 앱에서 사용하는 키가 기기의 하드웨어 기반 키 저장소에 저장되도록 보장합니다. 다음 섹션에서는 하드웨어 지원 키의 속성을 확인하는 방법과 증명 인증서의 확장 데이터를 해석하는 방법을 설명합니다.

시작하기 전에 기기에서 하드웨어 수준 키 증명을 지원하는지 확인하세요.

기기의 하드웨어 기반 키의 속성을 프로덕션 수준 환경에서 확인하려면 먼저 기기에서 하드웨어 수준 키 증명을 지원하는지 확인해야 합니다. 이렇게 하려면 증명 인증서 체인에 Google 증명 루트 키로 서명된 루트 인증서가 포함되어 있고 키 설명 데이터 구조 내의 attestationSecurityLevel 요소가 TrustedEnvironment 보안 수준 또는 StrongBox 보안 수준으로 설정되어 있는지 확인해야 합니다.

또한, 인증서 체인에 있는 서명을 확인하고 인증서 취소 상태 목록을 확인하여 체인에 취소된 키가 없는지 확인하는 것이 중요합니다. 모두 유효하고 루트가 Google 루트 키인 경우가 아니면 증명을 완전히 신뢰해서는 안 됩니다.

하드웨어 기반 키 쌍 검색 및 확인

키 증명 중에 키 쌍의 별칭을 지정하고 인증서 체인을 가져올 수 있습니다. 이 체인은 키 쌍의 속성을 확인하는 데 사용할 수 있습니다.

기기에서 하드웨어 수준 키 증명을 지원하는 경우 이 체인 내의 루트 인증서는 기기의 하드웨어 지원 키 저장소에 안전하게 프로비저닝된 증명 루트 키를 사용하여 서명됩니다.

키 증명을 구현하려면 다음 단계를 완료해야 합니다.

  1. KeyStore 객체의 getCertificateChain() 메서드를 사용하여 하드웨어 기반 키 저장소와 연결된 X.509 인증서 체인의 참조를 가져옵니다.
  2. 인증에 신뢰할 수 있는 별도의 서버로 인증서를 전송합니다.

    주의: 동일한 기기에서 다음 인증 프로세스를 완료하지 마세요. 해당 기기의 Android 시스템이 손상되면 인증 프로세스에서 신뢰할 수 없는 항목이 신뢰될 수 있습니다.

  3. 도구 모음에 가장 적합한 X.509 인증서 체인 파싱 및 유효성 검사 라이브러리에 대한 참조를 가져옵니다. 루트 공개 인증서를 신뢰할 수 있고 각 인증서가 체인의 그다음 인증서에 서명하는지 확인합니다.

  4. 각 인증서의 취소 상태를 확인하여 취소된 인증서가 없는지 확인합니다.

  5. 필요한 경우 최신 인증서 체인에만 있는 프로비저닝 정보 인증서 확장을 검사합니다.

    도구 모음에 가장 적합한 CBOR 파서 라이브러리에 대한 참조를 가져옵니다. 프로비저닝 정보 인증서 확장 프로그램이 포함된 루트에 가장 가까운 인증서를 찾습니다. 파서를 사용하여 해당 인증서에서 프로비저닝 정보 인증서 확장 데이터를 추출합니다.

    자세한 내용은 프로비저닝 정보 확장 프로그램 섹션을 참고하세요.

  6. 도구 모음에 가장 적합한 ASN.1 파서 라이브러리에 대한 참조를 가져옵니다. 키 증명 인증서 확장 프로그램이 포함된 루트에 가장 가까운 인증서를 찾습니다. 프로비저닝 정보 인증서 확장이 있는 경우 키 증명 인증서 확장이 바로 이후의 인증서에 있어야 합니다. 파서를 사용하여 해당 인증서에서 키 증명 인증서 확장 프로그램 데이터를 추출합니다.

    주의: 키 증명 인증서 확장이 체인의 리프 인증서에 있다고 가정해서는 안 됩니다. 체인에서 처음 발견된 확장만 신뢰할 수 있습니다. 그 외 확장은 보안 하드웨어에서 발급된 것이 아니며, 공격자가 신뢰할 수 없는 키의 가짜 증명을 만들려고 할 때 체인을 확장함으로써 발급되었을 수 있습니다.

    키 증명 샘플Bouncy Castle의 ASN.1 파서를 사용해 증명 인증서의 확장 데이터를 추출합니다. 자체 파서를 만들기 위한 참조로 이 샘플을 사용할 수 있습니다.

    자세한 내용은 키 증명 확장 프로그램 데이터 스키마 섹션을 참고하세요.

  7. 이전 단계에서 가져온 확장 데이터의 일관성을 확인하고 하드웨어 지원 키에 포함될 것으로 예상되는 값 집합과 비교합니다.

루트 인증서

증명의 신뢰성은 체인의 루트 인증서에 따라 결정됩니다. Google Play를 비롯하여 Google의 앱 제품군을 보유하는 데 필요한 테스트를 통과했으며, Android 7.0(API 수준 24) 이상이 포함되어 출시된 Android 기기는 Google 하드웨어 증명 루트 인증서로 서명된 증명 키를 사용해야 합니다. Android 8.0(API 수준 26)까지는 증명이 필요하지 않았습니다. 유효한 루트 인증서 집합은 JSON 형식 배열로 다운로드할 수 있습니다.

루트 인증서

다음 두 루트 인증서는 키 증명 인증서 체인을 확인할 때 신뢰 앵커로 사용해야 합니다.

-----BEGIN CERTIFICATE-----
MIIFHDCCAwSgAwIBAgIJAPHBcqaZ6vUdMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV
BAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMjIwMzIwMTgwNzQ4WhcNNDIwMzE1MTgw
NzQ4WjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B
AQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS
Sxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7
tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj
nar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq
C4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ
oVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O
JtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg
sTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi
igHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M
RPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E
aDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um
AGMCAwEAAaNjMGEwHQYDVR0OBBYEFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMB8GA1Ud
IwQYMBaAFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMA8GA1UdEwEB/wQFMAMBAf8wDgYD
VR0PAQH/BAQDAgIEMA0GCSqGSIb3DQEBCwUAA4ICAQB8cMqTllHc8U+qCrOlg3H7
174lmaCsbo/bJ0C17JEgMLb4kvrqsXZs01U3mB/qABg/1t5Pd5AORHARs1hhqGIC
W/nKMav574f9rZN4PC2ZlufGXb7sIdJpGiO9ctRhiLuYuly10JccUZGEHpHSYM2G
tkgYbZba6lsCPYAAP83cyDV+1aOkTf1RCp/lM0PKvmxYN10RYsK631jrleGdcdkx
oSK//mSQbgcWnmAEZrzHoF1/0gso1HZgIn0YLzVhLSA/iXCX4QT2h3J5z3znluKG
1nv8NQdxei2DIIhASWfu804CA96cQKTTlaae2fweqXjdN1/v2nqOhngNyz1361mF
mr4XmaKH/ItTwOe72NI9ZcwS1lVaCvsIkTDCEXdm9rCNPAY10iTunIHFXRh+7KPz
lHGewCq/8TOohBRn0/NNfh7uRslOSZ/xKbN9tMBtw37Z8d2vvnXq/YWdsm1+JLVw
n6yYD/yacNJBlwpddla8eaVMjsF6nBnIgQOf9zKSe06nSTqvgwUHosgOECZJZ1Eu
zbH4yswbt02tKtKEFhx+v+OTge/06V+jGsqTWLsfrOCNLuA8H++z+pUENmpqnnHo
vaI47gC+TNpkgYGkkBT6B/m/U01BuOBBTzhIlMEZq9qkDWuM2cA5kW5V3FJUcfHn
w1IdYIg2Wxg7yHcQZemFQg==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICIjCCAaigAwIBAgIRAISp0Cl7DrWK5/8OgN52BgUwCgYIKoZIzj0EAwMwUjEc
MBoGA1UEAwwTS2V5IEF0dGVzdGF0aW9uIENBMTEQMA4GA1UECwwHQW5kcm9pZDET
MBEGA1UECgwKR29vZ2xlIExMQzELMAkGA1UEBhMCVVMwHhcNMjUwNzE3MjIzMjE4
WhcNMzUwNzE1MjIzMjE4WjBSMRwwGgYDVQQDDBNLZXkgQXR0ZXN0YXRpb24gQ0Ex
MRAwDgYDVQQLDAdBbmRyb2lkMRMwEQYDVQQKDApHb29nbGUgTExDMQswCQYDVQQG
EwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABCPaI3FO3z5bBQo8cuiEas4HjqCt
G/mLFfRT0MsIssPBEEU5Cfbt6sH5yOAxqEi5QagpU1yX4HwnGb7OtBYpDTB57uH5
Eczm34A5FNijV3s0/f0UPl7zbJcTx6xwqMIRq6NCMEAwDwYDVR0TAQH/BAUwAwEB
/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFFIyuyz7RkOb3NaBqQ5lZuA0QepA
MAoGCCqGSM49BAMDA2gAMGUCMETfjPO/HwqReR2CS7p0ZWoD/LHs6hDi422opifH
EUaYLxwGlT9SLdjkVpz0UUOR5wIxAIoGyxGKRHVTpqpGRFiJtQEOOTp/+s1GcxeY
uR2zh/80lQyu9vAFCj6E4AXc+osmRg==
-----END CERTIFICATE-----
  
이전에 발급된 루트 인증서
-----BEGIN CERTIFICATE-----
MIIFYDCCA0igAwIBAgIJAOj6GWMU0voYMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV
BAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMTYwNTI2MTYyODUyWhcNMjYwNTI0MTYy
ODUyWjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B
AQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS
Sxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7
tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj
nar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq
C4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ
oVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O
JtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg
sTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi
igHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M
RPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E
aDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um
AGMCAwEAAaOBpjCBozAdBgNVHQ4EFgQUNmHhAHyIBQlRi0RsR/8aTMnqTxIwHwYD
VR0jBBgwFoAUNmHhAHyIBQlRi0RsR/8aTMnqTxIwDwYDVR0TAQH/BAUwAwEB/zAO
BgNVHQ8BAf8EBAMCAYYwQAYDVR0fBDkwNzA1oDOgMYYvaHR0cHM6Ly9hbmRyb2lk
Lmdvb2dsZWFwaXMuY29tL2F0dGVzdGF0aW9uL2NybC8wDQYJKoZIhvcNAQELBQAD
ggIBACDIw41L3KlXG0aMiS//cqrG+EShHUGo8HNsw30W1kJtjn6UBwRM6jnmiwfB
Pb8VA91chb2vssAtX2zbTvqBJ9+LBPGCdw/E53Rbf86qhxKaiAHOjpvAy5Y3m00m
qC0w/Zwvju1twb4vhLaJ5NkUJYsUS7rmJKHHBnETLi8GFqiEsqTWpG/6ibYCv7rY
DBJDcR9W62BW9jfIoBQcxUCUJouMPH25lLNcDc1ssqvC2v7iUgI9LeoM1sNovqPm
QUiG9rHli1vXxzCyaMTjwftkJLkf6724DFhuKug2jITV0QkXvaJWF4nUaHOTNA4u
JU9WDvZLI1j83A+/xnAJUucIv/zGJ1AMH2boHqF8CY16LpsYgBt6tKxxWH00XcyD
CdW2KlBCeqbQPcsFmWyWugxdcekhYsAWyoSf818NUsZdBWBaR/OukXrNLfkQ79Iy
ZohZbvabO/X+MVT3rriAoKc8oE2Uws6DF+60PV7/WIPjNvXySdqspImSN78mflxD
qwLqRBYkA3I75qppLGG9rp7UCdRjxMl8ZDBld+7yvHVgt1cVzJx9xnyGCC23Uaic
MDSXYrB4I4WHXPGjxhZuCuPBLTdOLU8YRvMYdEvYebWHMpvwGCF6bAx3JBpIeOQ1
wDB5y0USicV3YgYGmi+NZfhA4URSh77Yd6uuJOJENRaNVTzk
-----END CERTIFICATE-----
  
-----BEGIN CERTIFICATE-----
MIIFHDCCAwSgAwIBAgIJANUP8luj8tazMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV
BAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMTkxMTIyMjAzNzU4WhcNMzQxMTE4MjAz
NzU4WjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B
AQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS
Sxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7
tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj
nar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq
C4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ
oVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O
JtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg
sTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi
igHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M
RPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E
aDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um
AGMCAwEAAaNjMGEwHQYDVR0OBBYEFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMB8GA1Ud
IwQYMBaAFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMA8GA1UdEwEB/wQFMAMBAf8wDgYD
VR0PAQH/BAQDAgIEMA0GCSqGSIb3DQEBCwUAA4ICAQBOMaBc8oumXb2voc7XCWnu
XKhBBK3e2KMGz39t7lA3XXRe2ZLLAkLM5y3J7tURkf5a1SutfdOyXAmeE6SRo83U
h6WszodmMkxK5GM4JGrnt4pBisu5igXEydaW7qq2CdC6DOGjG+mEkN8/TA6p3cno
L/sPyz6evdjLlSeJ8rFBH6xWyIZCbrcpYEJzXaUOEaxxXxgYz5/cTiVKN2M1G2ok
QBUIYSY6bjEL4aUN5cfo7ogP3UvliEo3Eo0YgwuzR2v0KR6C1cZqZJSTnghIC/vA
D32KdNQ+c3N+vl2OTsUVMC1GiWkngNx1OO1+kXW+YTnnTUOtOIswUP/Vqd5SYgAI
mMAfY8U9/iIgkQj6T2W6FsScy94IN9fFhE1UtzmLoBIuUFsVXJMTz+Jucth+IqoW
Fua9v1R93/k98p41pjtFX+H8DslVgfP097vju4KDlqN64xV1grw3ZLl4CiOe/A91
oeLm2UHOq6wn3esB4r2EIQKb6jTVGu5sYCcdWpXr0AUVqcABPdgL+H7qJguBw09o
jm6xNIrw2OocrDKsudk/okr/AwqEyPKw9WnMlQgLIKw1rODG2NvU9oR3GVGdMkUB
ZutL8VuFkERQGt6vQ2OCw0sV47VMkuYbacK/xyZFiRcrPJPb41zgbQj9XAEyLKCH
ex0SdDrx+tWUDqG8At2JHA==
-----END CERTIFICATE-----
  
-----BEGIN CERTIFICATE-----
MIIFHDCCAwSgAwIBAgIJAMNrfES5rhgxMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV
BAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMjExMTE3MjMxMDQyWhcNMzYxMTEzMjMx
MDQyWjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B
AQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS
Sxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7
tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj
nar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq
C4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ
oVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O
JtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg
sTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi
igHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M
RPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E
aDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um
AGMCAwEAAaNjMGEwHQYDVR0OBBYEFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMB8GA1Ud
IwQYMBaAFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMA8GA1UdEwEB/wQFMAMBAf8wDgYD
VR0PAQH/BAQDAgIEMA0GCSqGSIb3DQEBCwUAA4ICAQBTNNZe5cuf8oiq+jV0itTG
zWVhSTjOBEk2FQvh11J3o3lna0o7rd8RFHnN00q4hi6TapFhh4qaw/iG6Xg+xOan
63niLWIC5GOPFgPeYXM9+nBb3zZzC8ABypYuCusWCmt6Tn3+Pjbz3MTVhRGXuT/T
QH4KGFY4PhvzAyXwdjTOCXID+aHud4RLcSySr0Fq/L+R8TWalvM1wJJPhyRjqRCJ
erGtfBagiALzvhnmY7U1qFcS0NCnKjoO7oFedKdWlZz0YAfu3aGCJd4KHT0MsGiL
Zez9WP81xYSrKMNEsDK+zK5fVzw6jA7cxmpXcARTnmAuGUeI7VVDhDzKeVOctf3a
0qQLwC+d0+xrETZ4r2fRGNw2YEs2W8Qj6oDcfPvq9JySe7pJ6wcHnl5EZ0lwc4xH
7Y4Dx9RA1JlfooLMw3tOdJZH0enxPXaydfAD3YifeZpFaUzicHeLzVJLt9dvGB0b
HQLE4+EqKFgOZv2EoP686DQqbVS1u+9k0p2xbMA105TBIk7npraa8VM0fnrRKi7w
lZKwdH+aNAyhbXRW9xsnODJ+g8eF452zvbiKKngEKirK5LGieoXBX7tZ9D1GNBH2
Ob3bKOwwIWdEFle/YF/h6zWgdeoaNGDqVBrLr2+0DtWoiB1aDEjLWl9FmyIUyUm7
mD/vFDkzF+wm7cyWpQpCVQ==
-----END CERTIFICATE-----
  

수신하는 증명 체인의 루트 인증서에 이 공개 키가 포함되어 있고 체인에 취소된 인증서가 없는 경우 다음을 알 수 있습니다.

  1. 키가 Google에서 안전하다고 신뢰하는 하드웨어에 있습니다.
  2. 루트 인증서에 증명 인증서에서 설명한 속성이 있습니다.

증명 체인에 다른 루트 공개 키가 있는 경우 Google에서는 하드웨어의 보안에 대해 어떠한 주장도 하지 않습니다. 이는 키가 손상되었다는 의미는 아니며, 증명이 있다고 하더라도 키가 보안 하드웨어에 있음을 입증하지는 않는다는 뜻입니다. 그에 맞게 보안 가정을 조정하세요.

루트 인증서에 이 페이지의 공개 키가 포함되지 않은 경우 다음 두 가지 이유가 있을 수 있습니다.

  • 대부분의 경우 기기가 Android 버전 7.0 미만으로 실행되었으며 기기에서 하드웨어 증명을 지원하지 않습니다. 이 경우 Android에 같은 종류의 증명 인증서를 생성하지만 Android 소스 코드에 하드코딩된 키로 서명된 증명 소프트웨어가 구현되어 있습니다. 이 서명 키는 보안 비밀이 아니므로, 공격자가 안전한 하드웨어를 제공하는 것으로 가장하여 만든 증명일 수 있습니다.
  • 또 다른 이유로는, 기기가 Google Play 기기가 아니기 때문일 수 있습니다. 이 경우 기기 제조업체는 자유롭게 자체 루트 인증서를 만들고 증명 데이터의 의미를 정의할 수 있습니다. 기기 제조업체의 문서를 참고하세요. Google은 어떤 기기 제조업체에서 이와 같은 작업을 했는지 알지 못합니다.

하드웨어 증명 루트 인증서 순환

Google에서 Android 키 증명을 위한 새로운 루트 인증서를 도입합니다. 이 변경사항은 민감한 애플리케이션의 증명 프로세스의 보안과 안정성을 향상합니다. Android 키 증명 (KeyMint)을 위한 새 루트 키가 생성되었습니다. 새 루트는 ECDSA P-384 키입니다.

필요한 조치

  • 앱이 Android 키 증명에 의존하는 경우 2026년 3월 31일까지 신뢰 저장소에 새 루트 인증서를 추가하세요. https://android.googleapis.com/attestation/root에서 새 인증서와 이전 인증서를 모두 다운로드합니다.
  • 원격 키 프로비저닝 (RKP)을 사용하는 기기는 2026년 2월부터 이 새로운 인증서를 기반으로 하는 인증서를 수신하기 시작합니다. RKP 지원 기기는 2026년 4월 10일까지 새로운 루트를 독점적으로 사용합니다.
  • 새 루트 인증서와 기존 루트 인증서를 모두 신뢰하도록 증명 프로세스를 업데이트합니다. 공장에서 프로비저닝된 키가 있는 이전 기기는 키 순환을 지원하지 않으며 이전 루트를 계속 사용합니다.
  • 인증서 확장 프로그램 스키마 자체는 변경되지 않으며 루트만 변경됩니다.
  • 새 루트의 사람이 읽을 수 있는 형식과 머신이 읽을 수 있는 형식이 모두 공개됩니다.

권장사항

이 작업은 보안 위험을 야기하므로 런타임에 신뢰할 수 있는 루트에 대해 엔드포인트를 쿼리하지 마세요. 공식 프로세스를 통해 신뢰할 수 있는 루트 변경사항을 처리합니다.

팩토리 키 단계적 폐지: 원격 키 프로비저닝 (RKP)

Android 16으로 출시되는 기기의 경우 시스템은 RKP만 지원합니다. 이 정책은 팩토리 키를 단계적으로 폐지합니다. 증명 키를 프로비저닝하고 관리하는 방식을 개선하여 RKP 지원이 선택사항이었던 Android 15 정책을 확장합니다. RKP는 시스템이 기기에 직접 키를 프로그래밍하지 않으므로 키 유출을 방지합니다. 기기에서 이러한 키를 삭제할 수 없습니다. 키를 취소해야 하는 경우 취소를 단일 기기로 타겟팅할 수 있습니다.

증명 확인 라이브러리

증명 확인 Kotlin 라이브러리를 사용하여 키 증명 인증서 체인을 확인합니다. 또한 이 라이브러리는 이미 새로운 루트 인증서를 통합합니다. 다른 검증 도구를 사용하는 경우 Kotlin 라이브러리로 이동하는 것이 좋습니다. 잘 테스트되었으며 맞춤 검증 도구에서 놓치는 경우가 많은 특이 사례를 다룹니다.

인증서 취소 상태 목록

증명 키는 잘못된 처리나 공격자의 의심되는 추출 등 여러 가지 이유로 취소될 수 있습니다. 따라서 증명 체인의 각 인증서 상태를 공식 인증서 취소 상태 목록(CRL)과 비교하여 확인해야 합니다. 이 목록은 Google에서 관리하며 https://android.googleapis.com/attestation/status에 게시됩니다. HTTP 응답의 Cache-Control 헤더가 업데이트 확인 빈도를 결정하므로 검증되는 모든 인증서에 네트워크 요청이 필요하지는 않습니다. 이 URL은 정상적으로 유효한 상태가 아닌 인증서의 취소 상태가 포함된 JSON 파일을 반환합니다. JSON 파일의 형식은 다음 JSON 스키마(초안 07) 정의를 따릅니다.

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "entries": {
      "description" : "Each entry represents the status of an attestation key. The dictionary-key is the certificate serial number in lowercase hex.",
      "type": "object",
      "propertyNames": {
        "pattern": "^[a-f1-9][a-f0-9]*$"
      },
      "additionalProperties": {
        "type": "object",
        "properties": {
          "status": {
            "description": "[REQUIRED] Current status of the key.",
            "type": "string",
            "enum": ["REVOKED", "SUSPENDED"]
          },
          "expires": {
            "description": "[OPTIONAL] UTC date when certificate expires in ISO8601 format (YYYY-MM-DD). Can be used to clear expired certificates from the status list.",
            "type": "string",
            "format": "date"
          },
          "reason": {
            "description": "[OPTIONAL] Reason for the current status.",
            "type": "string",
            "enum": ["UNSPECIFIED", "KEY_COMPROMISE", "CA_COMPROMISE", "SUPERSEDED", "SOFTWARE_FLAW"]
          },
          "comment": {
            "description": "[OPTIONAL] Free form comment about the key status.",
            "type": "string",
            "maxLength": 140
          }
        },
        "required": ["status"],
        "additionalProperties": false
      }
    }
  },
  "required": ["entries"],
  "additionalProperties": false
}

CRL 예:

{
  "entries": {
    "2c8cdddfd5e03bfc": {
      "status": "REVOKED",
      "expires": "2020-11-13",
      "reason": "KEY_COMPROMISE",
      "comment": "Key stored on unsecure system"
    },
    "c8966fcb2fbb0d7a": {
      "status": "SUSPENDED",
      "reason": "SOFTWARE_FLAW",
      "comment": "Bug in keystore causes this key malfunction b/555555"
    }
  }
}

인증서 해지 정책

인증은 Android 생태계에서 악용 방지 및 신뢰의 중추를 형성합니다. 기기의 부팅된 상태에 관한 암호화 방식으로 검증 가능한 문을 기기 외부 당사자에게 제공합니다.

증명 유효성의 중요한 특성으로 인해 키가 보안 침해되면 Android 증명 키의 인증서가 취소됩니다. 이 섹션에서는 인증서가 취소되는 경우의 정책을 간략하게 설명합니다. 이 정책은 시간이 지남에 따라 발전하고 추가 사례를 열거할 수 있습니다.

어떤 경우에 철회할 수 있나요?

유출된 증명 키는 항상 인증서가 취소될 수 있습니다. 유출은 다음과 같은 여러 방법으로 발견할 수 있습니다.

  • 실제 증명 데이터 분석
  • 소셜 미디어나 기타 공개 사이트에서 증명 키가 발견됨
  • 보안 연구원의 직접 보고

발견되면 증명 인증서의 일련번호가 해지 목록에 추가되어 증명 인증서가 해지됩니다. 일반적으로 이 과정은 발견 후 며칠 이내에 진행되지만 드문 경우 더 오래 걸릴 수 있습니다. 예를 들어 유출된 증명 키의 인증서 취소는 취소의 영향을 받는 기기를 안전하게 다시 프로비저닝할 수 있는 경우 일반적으로 지연됩니다. 취소의 영향 범위도 취소 일정에 중요한 요소입니다.

키 증명 확장 데이터 스키마

프로비저닝 정보 확장 데이터 스키마