2016-06-21 11 views
0

У меня есть следующий вопрос, когда я пытаюсь загрузить сертификат:DerInputStream.getLength(): lengthTag = 66

> java.io.IOException: DerInputStream.getLength(): lengthTag=66, too big. 
| at sun.security.util.DerInputStream.getLength(DerInputStream.java:561) 
| at sun.security.util.DerValue.init(DerValue.java:365) 
| at sun.security.util.DerValue.<init>(DerValue.java:320) 
| at sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:1914) 
| at java.security.KeyStore.load(KeyStore.java:1445) 
| at com.sequenceiq.cloudbreak.cloud.wap.client.WapClient.getFactory(WapClient.java:61) 
| at com.sequenceiq.cloudbreak.cloud.wap.client.WapClient.checkConnect(WapClient.java:80) 
| at com.sequenceiq.cloudbreak.cloud.wap.WapCredentialConnector.verify(WapCredentialConnector.java:53) 
| at com.sequenceiq.cloudbreak.cloud.handler.CredentialVerificationHandler.accept(CredentialVerificationHandler.java:43) 
| at com.sequenceiq.cloudbreak.cloud.handler.CredentialVerificationHandler.accept(CredentialVerificationHandler.java:20) 
| at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
| at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
| at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
| at java.lang.reflect.Method.invoke(Method.java:498) 
| at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:302) 
| at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) 
| at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
| at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:52) 
| at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
| at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 
| at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
| at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208) 
| at com.sun.proxy.$Proxy201.accept(Unknown Source) 
| at reactor.bus.EventBus$3.accept(EventBus.java:317) 
| at reactor.bus.EventBus$3.accept(EventBus.java:310) 
| at reactor.bus.routing.ConsumerFilteringRouter.route(ConsumerFilteringRouter.java:72) 
|2016-06-07 19:56:59,465 [reactorDispatcher-17] accept:56 [34mINFO [0;39m c.s.c.c.h.CredentialVerificationHandler - [owner:c90f9d2e-587f-4af6-a3a8-f1d321caa3a1] [type:springLog] [id:null] [name:debug2] Credential verification successfully finished 
| at reactor.bus.routing.TraceableDelegatingRouter.route(TraceableDelegatingRouter.java:51) 
| at reactor.bus.EventBus.accept(EventBus.java:591) 
| at reactor.bus.EventBus.accept(EventBus.java:63) 
| at reactor.core.dispatch.AbstractLifecycleDispatcher.route(AbstractLifecycleDispatcher.java:160) 
web01#3|2016-06-07 19:56:59,466 [http-nio-9091-exec-4] init:51 [34mINFO [0;39m c.s.c.s.s.c.a.ServiceProviderCredentialAdapter - [owner:c90f9d2e-587f-4af6-a3a8-f1d321caa3a1] [type:springLog] [id:] [name:] Result: CloudPlatformResult{status=OK, statusReason='null', errorDetails=null, request=CloudPlatformRequest{cloudContext=CloudContext{id=null, name='debug2', platform='StringType{value='WAP'}', owner='c90f9d2e-587f-4af6-a3a8-f1d321caa3a1'}, cloudC[email protected]4bd64260}} 
| at reactor.core.dispatch.MultiThreadDispatcher$MultiThreadTask.run(MultiThreadDispatcher.java:74) 
| at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
| at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
| at java.lang.Thread.run(Thread.java:745) 

Вот пример кода:

  keyInput = new FileInputStream(pKeyFile); 
      keyStore.load(keyInput, pKeyPassword.toCharArray()); 
      keyInput.close(); 

Обратите внимание, что перед загрузкой , Я пишу сертификат, полученный сервером в новом файле:

 File file = new File(name); 
     try(FileWriter fw = new FileWriter(file)){ 
      fw.write(certificate); 
     }catch(IOException e){ 
      LOGGER.debug("Writer issue",e); 
     } 

Я уже пытался прочитать файл после его написания и i т работ. Поэтому я уверен, что это не проблема InputStream.

Сертификат является файлом pkcs12. Может быть, я не могу загрузить сертификат, который только что написал в новом файле?

+0

Вы звоните fw.flush() или fw.close() после записи в файл? – hgrey

+0

Да, он скрыт в попытке с ресурсом http://docs.oracle.com/javase/7/docs/technotes/guides/language/try-with-resources.html – KlezFromSpace

+0

Хорошо, я думаю, нужен больше контекста файлы, которые вы сохраняете и загружаете. keystore.load() ожидает входной файл в формате JKS, это то, что вы пытаетесь загрузить? – hgrey

ответ

0

PKCS # 12 кодируется в формате DER, а формат DER - двоичный.

Вы используете FileReader, которое (от Javadoc)

Удобство класса для записи файлов символов.

, который inherites от OutputStreamWriter

OutputStreamWriter является мостом от символьных потоков до потоков байтов: Символы, записанные в ней кодируются в байты, используя указанную кодировку.

Поэтому

  1. У вас есть проблема кодирования преобразования двоичного СИМВОЛУ
  2. файл, который вы получаете на самом деле не в двоичном формате. Это может быть в Base64

В обоих случаях использовать FileOutputStream.write или Files.write для сохранения файла, и если переменная «сертификат» является String, сначала преобразовать его в двоичный

File file = new File(name); 
FileOutputStream fout = new FileOutputStream(file); 
fout.write (data); 

Files.write(Paths.get("name"), data); 
+0

I изменено на: try (FileOutputStream fw = new FileOutputStream (файл)) { \t fw.write (certificate.getBytes()); } catch (IOException e) { \t LOGGER.debug ("Writer issue", e); } и я получаю ту же ошибку, что и раньше. – KlezFromSpace

+0

Какая переменная является «сертификатом»? Как вы его прочитали? Проблема может быть там. У вас должен быть 'byte []' не 'String'. Вы проверили, действительно ли данные в двоичном формате? – pedrofb

+0

Я думаю, что он двоичный: \ Q? ÆØ? Zv $ ÁdùQC ¥ ¹ºÃH (похоже, когда я его печатаю). Сертификат - это строка. – KlezFromSpace

 Смежные вопросы

  • Нет связанных вопросов^_^