PKCS # 12: исключение DerInputStream.getLength () - PullRequest
16 голосов
/ 13 сентября 2011

Я генерирую сертификат с помощью команды keytool:

keytool -genkeypair -alias myRSAKey -keyalg RSA -keysize 1024 -keystore test.p12 -storepass test -storetype pkcs12

Затем, если я пытаюсь загрузить его, используя API-интерфейс безопасности Java, после получения файла в виде байта []:

KeyStore ks = KeyStore.getInstance("PKCS12");
try{
   ks.load(new ByteArrayInputStream(data), "test".toCharArray())
} catch (Exception e){
   ...
}

Я получаю DerInputStream.getLength (): lengthTag = 127, слишком большое исключение.

Что не так?

Ответы [ 8 ]

17 голосов
/ 06 ноября 2013

У меня была эта проблема, и я искал всю глубину Google и все еще не мог найти ответ. После нескольких дней борьбы с ужасным качественным унаследованным кодом я нашел причину этой ошибки.

KeyStore.load(InputStream is, String pass);

этот метод принимает InputStream и, если есть какие-либо проблемы с таким InputStream, выдается это исключение, некоторые проблемы, с которыми я столкнулся:

  • InputStream указывает на неправильный / пустой / только что созданный файл
  • InputStream уже открыт или что-то еще удерживает ресурс
  • InputStream уже использовался и читал , таким образом, позиция следующего байта InputStream - его конец

Последний был ответственным за мою проблему. Код создавал InputStream из сертификата и продолжал использовать его в двух вызовах KeyStore.load (), первый был успешным, второй всегда вызывал у меня эту ошибку.

8 голосов
/ 13 сентября 2011

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

См .: Разбор сертификата Java

6 голосов
/ 07 ноября 2016

Для других с подобной проблемой:

"keystore load: DerInputStream.getLength(): lengthTag=109, too big."

Для меня решение было удалить параметр: -storetype pkcs12, поскольку стандартный тип - jks

2 голосов
/ 17 ноября 2016

Укажите тип сертификата в коде например:

System.setProperty("javax.net.ssl.trustStoreType", "jks");
System.setProperty("javax.net.ssl.keyStoreType", "pkcs12"); 
0 голосов
/ 09 июля 2019

Это произошло со мной в Android Studio после миграции AndroidX и использования новой среды тестирования. Даже удаление существующего ~/.android/debug.keystore не удавалось мне

Решение было регенерировать его вручную (примите все вопросы как пустые и скажите «да» на последнем)

$ keytool -genkey -v -keystore debug.keystore -storepass android -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000

И скопируйте его

$ rm ~/.android/debug.keystore
$ cp debug.keystore ~/.android/debug.keystore
0 голосов
/ 11 июня 2018

Это произошло со мной, потому что я скопировал и вставил файл .p12 локально на моем компьютере с Windows 10.Понятия не имею, как / почему это проблема, но когда я клонирую проект с файлами .p12 и указываю на них свой код, файлы работают.Однако копирование и вставка файлов в проводнике Windows в другое место на жестком диске приводит к этой ошибке !!!!

0 голосов
/ 22 января 2018

У меня была такая же проблема.

Мое решение состоит в том, чтобы заменить PKCS12 на jceks в строке ниже, потому что я, очевидно, использовал неправильный тип.

KeyStore clientStore = KeyStore.getInstance("PKCS12");
0 голосов
/ 14 сентября 2011

Вы делаете что-то не так.
Я попробовал вашу команду и затем загрузил p12 очень хорошо.
Следующий код работает:

 FileInputStream fin = new FileInputStream("..\\test.p12");
 KeyStore ks = KeyStore.getInstance("PKCS12");
 ks.load(fin, "123456".toCharArray());
 System.out.println(ks.getCertificate("myrsakey"));

Мне было интересно, если вы поставили команду какВы получаете сообщение об ошибке от keytool, что пароль должен содержать не менее 6 символов.
Вы не получили эту ошибку?Какую версию Java вы используете?
Примечание: если вам нужно создать сертификаты, вы также можете обратиться к этому инструменту.
http://sourceforge.net/projects/certhelper/

...