Java. Io. Ioexception: Short Read of Der Length

I'm trying to create a Java application that can read x509 certificates informations and display them in a TableView.

But i've a problem when i'm trying to display those informations with the code below

@FXML
private void handleHDD() throws CertificateException, IOException{
    String userDir = System.getProperty("user.home");
    File folder = new File(userDir +"\\Desktop\\Certificate_Folder");
    File[] certificates = folder.listFiles();
    if (certificates!=null){

        String columnHeader[] = {"Nom","Version","N°série","Algorithme de signature","Emetteur","Valide à partir de","Valide jusqu'au","Objet","Clé publique"};

        int sizeColumns = 9;

        for (File file : certificates){
            if(file.isFile()){
            CertificateFactory cf = CertificateFactory.getInstance("X.509");
            InputStream input = new FileInputStream(file);

            X509Certificate cert = (X509Certificate) cf.generateCertificate(input);
            input.close();
            for (int j = 0; j < sizeColumns; j++) {
                data.add(new CertificateModel(file.getName().replace(".der", ""),cert.getVersion(),cert.getSerialNumber().toString(),cert.getSigAlgName(),cert.getIssuerDN().toString(),cert.getNotBefore(),cert.getNotAfter(),cert.getSubjectDN().toString(),cert.getPublicKey().toString()));
                TableColumn col = new TableColumn();
                col.setText(columnHeader[j]);
                col.setMinWidth(200);
                col.setCellValueFactory(new PropertyValueFactory<CertificateModel, String>(columnHeader[j]));
                table.getColumns().addAll(col);
            }               
            table.setItems(data);

            }


            }

        }
    }

When i try to execute it, i hav the following exception: java.security.cert.CertificateException


This is the full exception stack:

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774)
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$ClickGenerator.postProcess(Scene.java:3470)
at javafx.scene.Scene$ClickGenerator.access$8100(Scene.java:3398)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3766)
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:381)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:417)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:416)
at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
at com.sun.glass.ui.View.notifyMouse(View.java:937)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.reflect.InvocationTargetException
    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 sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1771)
    ... 33 more
Caused by: java.security.cert.CertificateException: Unable to initialize, java.io.IOException: Short read of DER length
    at sun.security.x509.X509CertImpl.<init>(X509CertImpl.java:198)
    at sun.security.provider.X509Factory.engineGenerateCertificate(X509Factory.java:102)
    at java.security.cert.CertificateFactory.generateCertificate(CertificateFactory.java:339)
    at cm.camgovca.view.CertificateOverviewController.handleHDD(CertificateOverviewController.java:98)
    ... 43 more
Caused by: java.io.IOException: Short read of DER length
    at sun.security.util.DerInputStream.getLength(DerInputStream.java:582)
    at sun.security.util.DerValue.<init>(DerValue.java:252)
    at sun.security.util.DerInputStream.getDerValue(DerInputStream.java:451)
    at sun.security.x509.X509CertImpl.parse(X509CertImpl.java:1784)
    at sun.security.x509.X509CertImpl.<init>(X509CertImpl.java:195)
    ... 46 more

The line 98 of CertificateOverview.java is

X509Certificate cert = (X509Certificate) cf.generateCertificate(input);

And my certificate is DER Encoded (.der)

2

2 Answers

If you look at the documentation of CertificateFactory#generateCertificate it says:

Throws: CertificateException - on parsing errors.

So, as suggested in the comments, most probably your certificate file is not in the expected format.

Especially the following line in the documentation may be of interest:

In the case of a certificate factory for X.509 certificates, the certificate provided in inStream must be DER-encoded and may be supplied in binary or printable (Base64) encoding. If the certificate is provided in Base64 encoding, it must be bounded at the beginning by -----BEGIN CERTIFICATE-----, and must be bounded at the end by -----END CERTIFICATE-----.

If you post an exception stack, with detailed exception messages, we probably can help more.

If you have a keystore defined, make sure that it is where you have defined and that the application can read it.

In my case the hint was a bit lower down in the stack trace ("java.security.KeyStore.load"):

Caused by: java.io.IOException: Short read of DER length
at sun.security.util.DerInputStream.getLength(DerInputStream.java:582) ~[na:1.8.0_212]
at sun.security.util.DerValue.init(DerValue.java:391) ~[na:1.8.0_212]
at sun.security.util.DerValue.<init>(DerValue.java:332) ~[na:1.8.0_212]
at sun.security.util.DerValue.<init>(DerValue.java:345) ~[na:1.8.0_212]
at sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:1938) ~[na:1.8.0_212]
at java.security.KeyStore.load(KeyStore.java:1445) ~[na:1.8.0_212]
at org.apache.tomcat.util.security.KeyStoreUtil.load(KeyStoreUtil.java:67) ~[tomcat-embed-core-9.0.27.jar!/:9.0.27]

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Sarah Jenkins

Sarah Jenkins

Senior Technology Editor & AI Specialist

Sarah Jenkins is a veteran tech journalist with over 12 years of experience covering artificial intelligence, mobile innovations, and digital ethics. Her insights have appeared in leading technology publications worldwide.

Share this article
Twitter Facebook Pinterest