Как лучше всего сгенерировать запрос на подпись сертификата с помощью AndroidKeyStoreProvider?

Я прочитал эту статью.

В нем говорится, как сгенерировать KeyPair, однако не указано, как сгенерировать запрос на подпись сертификата на основе сгенерированных ключей.

Согласно моим исследованиям, для создания CSR на Java образцы из Интернета обычно используют пакет sun.* или библиотеку BouncyCastle. Похоже, нет способа сгенерировать CSR со стандартным java.security API. Я прочитал это и вроде бы говорит о том же.

У меня нет выбора, кроме как использовать BouncyCastle? Трудно представить, что разработчики Android не рассматривают такое использование.

Кстати, в статье также упоминается, что:

Для создания нового PrivateKey необходимо также указать исходные атрибуты X.509, которые будут иметь самозаверяющий сертификат. Позже вы можете заменить сертификат сертификатом, подписанным центром сертификации.

Предположим, я наконец получил сертификат, подписанный Центром сертификации. Что именно я должен сделать, чтобы заменить сертификат позже?


person Yeung    schedule 18.09.2014    source источник
comment
Привет! Вы нашли решение? Я был бы признателен, если бы вы поделились материалами, как генерировать CSR без Bouncy/SpongyCastle   -  person BekaBot    schedule 08.02.2017


Ответы (2)


Что касается создания CSR (запрос на подпись сертификата) на телефоне Android, я думаю, что довольно просто использовать Spongycastle вместо этого. Это порт Bouncycastle для Android.

Предположим, я наконец получил сертификат, подписанный центром сертификации. Что именно я должен сделать, чтобы «заменить сертификат позже»?

Как только у вас будет фактически подписанный сертификат, который вы должны получить от ЦС (центр сертификации), вам больше не нужен ваш CSR; вы должны просто сохранить подписанный сертификат на телефоне. Где их сохранить — я думаю, вы можете получить помощь здесь.

person cyberPrivacy    schedule 07.12.2014

Лучший способ создать CSR на Android — использовать SpongyCastle, который является реализацией BouncyCastle для Android. SpongyCastle уже делает за вас большую часть тяжелой работы, так что это значительно облегчит вашу жизнь.


Моя реализация в значительной степени основана на ответе, найденном здесь, но использует Android KeyStore для безопасности и JcaContentSignerBuilder() SpongyCastle вместо пользовательского ContentSigner .

Добавьте SpongyCastle в свой build.gradle файл:

compile 'com.madgag.spongycastle:core:1.51.0.0'
compile 'com.madgag.spongycastle:pkix:1.51.0.0'

Создайте KeyPair в Android KeyStore:

KeyPairGenerator keyGen = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore"); // store the key in the Android KeyStore for security purposes
keyGen.initialize(new KeyGenParameterSpec.Builder(
                  "key1",
                  KeyProperties.PURPOSE_SIGN)
                  .setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
                  .setDigests(KeyProperties.DIGEST_SHA256,
                                KeyProperties.DIGEST_SHA384,
                                KeyProperties.DIGEST_SHA512)
                  .build()); // defaults to RSA 2048
KeyPair keyPair = keyGen.generateKeyPair();

Создайте CSR, используя указанную пару ключей:

private final static String CN_PATTERN = "CN=%s, O=Aralink, OU=OrgUnit";

//Create the certificate signing request (CSR) from private and public keys
public static PKCS10CertificationRequest generateCSR(KeyPair keyPair, String cn) throws IOException, OperatorCreationException {
        String principal = String.format(CN_PATTERN, cn);

        ContentSigner signer = new JcaContentSignerBuilder(DEFAULT_RSA_SIGNATURE_ALGORITHM).build(keyPair.getPrivate());

        PKCS10CertificationRequestBuilder csrBuilder = new JcaPKCS10CertificationRequestBuilder(
                new X500Name(principal), keyPair.getPublic());
        ExtensionsGenerator extensionsGenerator = new ExtensionsGenerator();
        extensionsGenerator.addExtension(Extension.basicConstraints, true, new BasicConstraints(
                true));
        csrBuilder.addAttribute(PKCSObjectIdentifiers.pkcs_9_at_extensionRequest,
                extensionsGenerator.generate());
        PKCS10CertificationRequest csr = csrBuilder.build(signer);

        return csr;
    }
}

Вот и все, теперь у вас есть PKCS10CertificationRequest, который вы можете отправить на свой сервер.

person Josh Correia    schedule 29.07.2020