я генерация хранилища ключей из сертификата следующим образом:Android и исключение по внедрению собственного магазина пользовательских ключей
export CLASSPATH=/Developer/BouncyCastle/bcprov-jdk16-146.jar
CERTSTORE=~/bitbucket/Android/CoooriJED/res/raw/mykeystore.bks
if [ -a $CERTSTORE ]; then
rm $CERTSTORE || exit 1
fi
keytool \
-importcert \
-v \
-trustcacerts \
-alias 0 \
-file <(openssl x509 -in mycert.pem) \
-keystore $CERTSTORE \
-storetype BKS \
-provider org.bouncycastle.jce.provider.BouncyCastleProvider \
-providerpath /Developer/BouncyCastle/bcprov-jdk16-146.jar \
-storepass password
Это создает хранилище ключей без видимых проблем. В Eclipse я очищаю свой проект Android и вижу «mykeystore.bks» в исходной папке. Загружаю хранилище ключей следующим образом:
private KeyStore keyStore()
{
try {
KeyStore trusted = KeyStore.getInstance("BKS");
InputStream in = context.getResources().openRawResource(R.raw.mykeystore);
try {
trusted.load(in, "password".toCharArray()); // *Throws an exception*
} finally {
in.close();
}
return trusted;
} catch (Exception e) {
throw new AssertionError(e);
}
}
я называю этот метод следующим образом (я удалил обработку исключений, чтобы сделать его легче читать здесь):
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
kmf.init(keyStore(), "password".toCharArray());
Однако линия trusted.load(in, "password".toCharArray())
вызывает «Неверную версию хранилища ключей» IOException. Почему это?
Благодарим вас заранее.
Можете ли вы перечислить содержимое содержимое файла с Keytool? Правильно ли пароль? Какую версию Android вы тестируете? BTW, если он содержит только сертификаты, вам не нужны вызовы KeyManagerFactory и т. Д. Это частные ключи. –
Android 2.1, 2.3 и 4.0. Пароль правильный. – SK9
Так читается ли файл на вашей машине разработки? –