Неправильная версия хранилища ключей при вызове Android
Я хочу сделать 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
И команда keylist возвращают правильное значение.
Но когда я делаю :
KeyStore ks = KeyStore.getInstance("BKS");
InputStream in = getResources().openRawResource(R.raw.keystore);
ks.load(in, "mypass".toCharArray());
у меня ошибка :
wrong version of keystore
Я пытался использовать несколько версий bouncycast, но результат тот же. Я также попытался определить размер ключа 1024, но ничего не изменилось.
Есть идеи?
Переведено автоматически
Ответ 1
Вам нужно изменить тип хранилища ключей с BKS на BKS-v1 (BKS-v1 - более старая версия BKS). Потому что версия BKS изменилась, как сказано здесь
Есть другое решение, которое намного, намного проще:
- Использование Portecle:
- Загружает Portecle http://portecle.sourceforge.net /
- Откройте свой файл bks с паролем и portecle
- Сделать инструменты>> Изменить тип хранилища ключей>>BKS-v1
- Сохраните файл
- Вы можете использовать проводник хранилища ключей
Новый файл будет закодирован с помощью BKS-v1 и больше не будет отображать ошибку. Чтобы изменить тип хранилища ключей, откройте проводник хранилища ключей и перейдите по ссылке Tools -> Change KeyStore Type
, а затем сохраните файл.
Примечание:
Android работает с разными версиями BKS: например, API 15 потребует BKS-1 в отличие от API 23, который требует BKS, поэтому вам может потребоваться поместить оба файла в ваше приложение.
Вы можете использовать этот код для переключения между ними в зависимости от уровня API:
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());
Ответ 2
Наконец-то я использовал графический редактор (KeyStore Explorer) под Windows, и он работает.
Возможно, ошибка была вызвана проблемами с версией Java / Mac
Ответ 3
Решение здесь, способное удалить версию prolem
Создание файла BKS для Android-клиента
Сведения об установке программного обеспечения, необходимые для создания файла BKS:
Загрузите программное обеспечение для просмотра хранилища ключей по ссылке 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 file / java / jre7 / lib / security.
установите программное обеспечение Keystore Explorer.
Шаги для создания файла BKS: (Нужен файл CA, файл сертификата, файл ключа и .P12, т. е. файл PKCS (если доступен).
1) Создание файла доверия с использованием файла CA .crt с использованием программного обеспечения хранилища ключей.
Шаги:
Откройте программное обеспечение
Перейдите Файл-> Создать-> выбрать .Нажмите кнопку мастера импорта файла сертификата CA, чтобы перейти к инструменту -> Импортировать доверенный сертификат -> выбрать файл CA .crt -> ввести пароль -> (Это вызовет исключение, если сертификат самоподписывается) принудительно импортировать файл.
4. Сохраните файл с расширением .bks.
2) Создание файла ключа с использованием файла .P12 с использованием программного обеспечения хранилища ключей
Шаги
Откройте software Go File-> Создать-> выбрать .Нажмите кнопку "Далее" в мастере
Импорт> инструмент перехода к файлу p12 -> Импорт пары ключей -> выберите PKCS # 12 из мастера - > введите пароль для расшифровки файла и файла brow -> Введите имя алисы (если хотите изменить что-либо еще, можете оставить как есть) -> Введите новый пароль
Сохраните файл с расширением .bks.
3) Создание ключевого файла с использованием файла if .P12 недоступен с помощью программного обеспечения для хранения ключей
Шаги
Открытое программное обеспечение
Перейдите Файл-> Создать-> выбрать .BKS из мастера Импорта> инструмент перехода к файлу p12 -> Импорт пары ключей -> выберите OpenSSL из мастера - > непроверенный пароль для расшифровки файла, файла brow .key и .crt (файл сертификата, а не CA) -> Введите имя пользователя (если хотите изменить, остальное можете оставить как есть) -> Введите новый пароль
Сохраните файл с расширением .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();
}
}
}
Ответ 4
Я публикую этот ответ, чтобы предоставить версию cmdline для преобразования .pkcs12
файла в keystore.bks
Что нужно:
- Portecle - скачать с https://sourceforge.net/projects/portecle /
Если вы не знаете, как сгенерировать .PKCS12
-файл, загляните на эти сайты:
- http://www.robinhowlett.com/blog/2016/01/05/everything-you-ever-wanted-to-know-about-ssl-but-were-afraid-to-ask/
- https://www.sslshopper.com/article-most-common-java-keytool-keystore-commands.html
Для этого примера я использую jetty.pkcs12
в качестве исходного кода. Команда генерирует: keystore.bks /usr/local/share/java/portecle-1.9/ - это путь, по которому я установил загруженный инструмент для удаления ключей (.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-хранилище ключей под Android
Благодаря предыдущей публикации я смог найти решение и предоставить этот cmd. Надеюсь, это кому-то поможет!