Подтвердить что ты не робот

Неверная версия хранилища ключей при вызове android

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

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

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  

И команда keylist вернет правильное значение.

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

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

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

wrong version of keystore

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

Любые идеи?

4b9b3361

Ответ 1

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

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

И используйте эту версию при создании своего хранилища ключей: Версия 1.46 найдено здесь

Может ли это помочь...

Ответ 2

Не нужно снова делать что-либо!

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

Есть еще одно решение, это намного проще:

  • Использование Portecle:

    • Загрузка Portecle http://portecle.sourceforge.net/
    • Откройте файл bks с паролем и portecle
    • Инструменты → Изменить тип Keystore → BKS-v1
    • Сохранить файл
  • Вы можете использовать KeyStore Explorer

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

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

Примечание 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());

Ответ 3

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

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

Ответ 4

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

Создание файла 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.ePKCS(если есть).

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

Шаги:

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

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

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

Шаги

Открыть программное обеспечение  Go File- > New- > выберите .BKS из мастера

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

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

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

Шаги

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

Перейти Файл- > Создать- > выберите .BKS из мастера Импорт > файл p12 Go Tool → Импортировать пару ключей → выберите OpenSSL из мастера → unchecked decription password для файла, брови .key и .crt(файл сертификата не CA) → Введите имя alise (если хотите изменить else, можно сохранить как есть) → Введите новый пароль

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

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

код:

 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();
        }

    }

}

Ответ 5

Я отправляю этот ответ, чтобы предоставить 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. Надеюсь, это поможет кому-то!