Я генерирую пару ключей на устройстве Android (8.1 / API уровень 27), используя следующий фрагмент кода:
KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(
KEY_ALIAS,
KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY
)
.setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
.setCertificateSubject(new X500Principal("CN=X, O=X"))
.setCertificateSerialNumber(BigInteger.ONE)
.setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
.build();
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
generator.initialize(spec);
generator.generateKeyPair();
Затем я хочу подтвердить, что сгенерированный сертификат подписан корневым сертификатом Google, чтобы доказать, что сертификат хранится в TEE (см. Проверка пар ключей с аппаратной поддержкой с помощью Key Attestation ):
KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) keystore
.getEntry(KEY_ALIAS, null);
KeyFactory keyFactory = KeyFactory.getInstance(
privateKeyEntry.getPrivateKey().getAlgorithm(),
"AndroidKeyStore"
);
KeyInfo keyInfo = keyFactory.getKeySpec(privateKeyEntry.getPrivateKey(), KeyInfo.class);
Log.i(TAG, "Is key in secure hardware: " + keyInfo.isInsideSecureHardware());
Log.i(TAG, "Number of certificates in the chain: " + privateKeyEntry.getCertificateChain().length);
Что возвращает:
Is key in secure hardware: true
Number of certificates in the chain: 1
Единственный сертификат в цепочке - это сертификат, который содержит сгенерированный открытый ключ. И у него нет данных расширения сертификата , чтобы подтвердить это.
Как я могу сгенерировать пару ключей, чтобы у меня была цепочка сертификатов с данными расширения для подтверждения?