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 в другое место на жестком диске вызывает эту ошибку!!!!