Вопрос по java, bouncycastle, keystore, android, certificate – Неправильная версия хранилища ключей на вызове Android

32

Я хочу сделать запрос https.

Я использую bouncycastle для генерации хранилища ключей следующим образом:

keytool -importcert -trustcacerts -alias ludevCA -file lu_dev_cert.crt -keypass mypass -keystore keystore.bks -storepass mypass -storetype BKS -providerclass org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath bcprov-jdk15on-146.jar  

И команда списка ключей возвращает правильное значение.

Но, когда я делаю :

KeyStore ks = KeyStore.getInstance("BKS");
InputStream in = getResources().openRawResource(R.raw.keystore);  
ks.load(in, "mypass".toCharArray());

у меня есть ошибка:

wrong version of keystore

Я пытался использовать несколько версий Bouncycast, но результат тот же. Я также попытался определить размер ключа 1024, но ничего не изменилось.

Есть идеи ?

Не забудьте использовать SHA-256, потому что SHA-1 больше не используется с Android 23+, и по умолчанию ... Cukic0d

Ваш Ответ

6   ответов
2

Решение здесь, в состоянии удалить версию Prolem

Создание файла BKS для клиента Android

Детали установки программного обеспечения, необходимые для создания файла BKS:

Загрузите программное обеспечение Keystore Explorer по ссылкеhttp://keystore-explorer.sourceforge.net/

Скачать UnlimitedJCEPolicyJDK7 сhttp://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html

Извлеките zip и скопируйте US_export_policy и local_policy в вашу папку C: / programes / java / jre7 / lib / security.

установите программное обеспечение Keystore Explorer.

Шаги для создания файла BKS: (Требуется файл CA, файл сертификата, файл ключа и файл .P12 i.e.PKCS (если имеется).

1) Создание файла доверия с помощью файла CA.crt с использованием программного обеспечения хранилища ключей.

шаги:

Открытое программное обеспечение
Перейдите в Файл-> Создать-> .BKS в мастере Чтобы импортировать файл сертификата CA Перейти к инструменту & gt; Импортировать доверенный сертификат -> выбрать файл CA.crt - & gt; entert password- & gt; (будет выдано исключение, если сертификат самозаверяющий) принудительно импортировать файл.

4. Сохраните файл с расширением .bks.

2) Создание файла ключей с использованием файла .P12 с использованием программного обеспечения хранилища ключей

меры

Открытое программное обеспечение  Перейдите в Файл-> Создать-> .BKS в мастере

Импортировать & gt; p12 файл Go Tool - & gt; Импорт пары ключей - & gt; выберите PKCS # 12 из мастера - & gt; введите пароль для расшифровки файла и файла brows - & gt; Введите другое имя (если хотите изменить, можете оставить как есть) -> введите новый пароль

Сохраните файл с расширением .bks.

3) Создание файла ключей с помощью, если .P12 не доступен файл с помощью программного обеспечения хранилища ключей

меры

Открытое программное обеспечение

Перейдите в Файл-> Создать-> .BKS в мастере Импортировать & gt; p12 файл Go Tool - & gt; Импорт пары ключей - & gt; выберите OpenSSL в мастере - & gt; непроверенный пароль для расшифровки файла, brows .key и .crt (файл сертификата не CA) - & gt; Введите другое имя (если хотите изменить, можете оставить как есть) -> введите новый пароль

Сохраните файл с расширением .bks.

Скопируйте оба файла в папку res / raw (оба файла BKS являются обязательными).

Код:

 static final String ENABLED_CIPHERS[] = {
    "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
    "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
    "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
    "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
    "TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
    "TLS_DHE_RSA_WITH_AES_256_CBC_SHA",
    "TLS_DHE_DSS_WITH_AES_128_CBC_SHA",
    "TLS_ECDHE_RSA_WITH_RC4_128_SHA",
    "TLS_ECDHE_ECDSA_,WITH_RC4_128_SHA",
    "TLS_RSA_WITH_AES_256_CBC_SHA",
    "TLS_RSA_WITH_AES_128_CBC_SHA",
    "SSL_RSA_WITH_3DES_EDE_CBC_SHA",
    "SSL_RSA_WITH_RC4_128_SHA",
    "SSL_RSA_WITH_RC4_128_MD5",
};
// put this in a place where it can be reused
static final String ENABLED_PROTOCOLS[] = {
        "TLSv1.2", "TLSv1.1", "TLSv1"
    };

   private void sslCon()
    {
        try {
                             // setup truststore to provide trust for the server certificate
              // load truststore certificate
            InputStream trustStoresIs = getResources().openRawResource(R.raw.client_ca);
            String trustStoreType = KeyStore.getDefaultType();
            KeyStore trustStore = KeyStore.getInstance(trustStoreType);
            trustStore.load(trustStoresIs, "spsoft_123".toCharArray());
            //keyStore.setCertificateEntry("ca", ca);

            // initialize trust manager factory with the read truststore
            String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
            TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
            tmf.init(trustStore);

            // setup client certificate
            // load client certificate
            InputStream keyStoreStream = getResources().openRawResource(R.raw.client_cert_key);
            KeyStore keyStore = null;
            keyStore = KeyStore.getInstance("BKS");
            keyStore.load(keyStoreStream, "your password".toCharArray());

            KeyManagerFactory keyManagerFactory = null;
            keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
            keyManagerFactory.init(keyStore, "your password".toCharArray());

            // Create an SSLContext that uses our TrustManager
            SSLContext context = SSLContext.getInstance("SSL");
            context.init(keyManagerFactory.getKeyManagers(), tmf.getTrustManagers(), null);

            SSLSocketFactory sslsocketfactory = (SSLSocketFactory)context.getSocketFactory();
            InetAddress serverAddr = InetAddress.getByName("192.168.11.104");
            sslSocket = (SSLSocket) sslsocketfactory.createSocket(serverAddr,, 5212);
            //String[] ciphers = sslSocket.getEnabledCipherSuites();
            sslSocket.setEnabledCipherSuites(ENABLED_CIPHERS);
            // put this right before setEnabledCipherSuites()!
            //sslSocket.setEnabledProtocols(ENABLED_PROTOCOLS);
            //InputStream inputStream =  sslSocket.getInputStream();
            OutputStream out = sslSocket.getOutputStream();

            Toast.makeText(getApplicationContext(), "Connected", Toast.LENGTH_SHORT).show();
            sslSocket.close();


        } catch (KeyManagementException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (CertificateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (KeyStoreException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnrecoverableKeyException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}
Пример поста, который должен был быть отформатирован .....
0

Используйте из них.

KeyStore.getInstance (& Quot; БКС & Quot;); KeyStore.getInstance (& Quot; PKCS12 & Quot;);

25

No need to do every thing again !!!

Вам необходимо изменить тип хранилища ключей: с BKS на BKS-v1 (BKS-v1 является более старой версией BKS). Потому что версия BKS изменилась как сказаноВот

Есть еще одно решение, гораздо более простое:

  1. Using Portecle:

  2. You may use KeyStore Explorer

Новый файл будет закодирован с помощью BKS-v1 и больше не будет отображать ошибку ....

Note: Android работает с разными версиями BKS: например, для API 15 потребуется BKS-1, в отличие от API 23, для которого требуется BKS, поэтому вам может потребоваться поместить оба файла в ваше приложение.

Note 2: Вы можете использовать этот код:

int bks_version;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
    bks_version = R.raw.publickey; //The BKS file
} else {
    bks_version = R.raw.publickey_v1; //The BKS (v-1) file
}
KeyStore ks = KeyStore.getInstance("BKS");
InputStream in = getResources().openRawResource(bks_version);  
ks.load(in, "mypass".toCharArray());
казалось, чтобы решить проблему, которая у меня была для устройства 4.0.4, но устройства с 4.1.1 / 2 по-прежнему имеют ту же проблему
Не знаю, почему, но когда я попытался изменить его с помощью Portecle, он просто запретил мне менять хранилище ключей, потому что оно говорит о невосстановимом исключении ключа. Но затем я попробовал это с Windows и Keystore Explorer и изменил тип хранилища ключей оттуда, и это работало как очарование. +1
Обходной путь для 4.1.1 / 2:if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { ... }
0

Я публикую этот ответ, чтобы предоставить cmdline-версию для преобразования .pkcs12-файла в keystore.bks

Что нужно:

Если вы не знаете, как создать файл .PKCS12, проверьте эти сайты:

Для этого примера я использую jetty.pkcs12 в качестве источника. Команда генерирует: keystore.bks /usr/local/share/java/portecle-1.9/ - это путь, по которому я установил загруженный Portecle-Tool (.ZIP)

keytool -importkeystore -srckeystore jetty.pkcs12 \
-srcstoretype PKCS12 -deststoretype BKS -providerpath \
/usr/local/share/java/portecle-1.9/bcprov.jar -provider \
org.bouncycastle.jce.provider.BouncyCastleProvider-destkeystore \
keystore.bks

Теперь вы можете использовать BKS-Keystore под Android

Благодаря предыдущей публикации я смог найти решение и предоставить этот cmd. Надеюсь, это поможет кому-то!

31

Посмотрите на этоAndroid: доверяя SSL-сертификатам

  -storetype BKS
  -provider org.bouncycastle.jce.provider.BouncyCastleProvider
  -providerpath /path/to/bouncycastle.jar

And use this version when creating your keystore: Version 1.46 нашел здесь

Пусть это поможет ...

Это именно то, что я сделал (и я снова выполняю учебное пособие), но результат все тот же. JuSchz
@MarcinOrlowski Означает ли это, что мы зависим от надувной банки? Есть ли какой-нибудь стандартный метод, который мы можем использовать на Android, Java, .net и других? Я немного смущен этим.
Я могу подтвердить, что это работает!
К вашему сведению, ссылка на v1.46 сейчас не работает
@julesanchez: вы ДОЛЖНЫ использовать bcprov-jdk16-146.jar. Последний v147 вызовет указанные проблемы
5

я использовал графический редактор (KeyStore Explorer) под Windows, и он работает.

Возможно ошибка была вызвана проблемами версии Java / Mac

Похожие вопросы