PKCS#12: DerInputStream.метода getlength может служить метод() исключение

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

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

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

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

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

что не так?

7 ответов


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

KeyStore.load(InputStream is, String pass);

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

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

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


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

относятся: Синтаксический Анализ Сертификата Java


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

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

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


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

System.setProperty("javax.net.ssl.trustStoreType", "jks");
System.setProperty("javax.net.ssl.keyStoreType", "pkcs12"); 

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

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

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


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

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

KeyStore clientStore = KeyStore.getInstance("PKCS12");

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