代码之家  ›  专栏  ›  技术社区  ›  user8313128

java.io。IOException:DER长度的短读取

  •  5
  • user8313128  · 技术社区  · 7 年前

    我正在尝试创建一个Java应用程序,它可以读取x509证书信息并在 TableView

    但是当我试图用下面的代码显示这些信息时,我遇到了一个问题

    @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);
    
                }
    
    
                }
    
            }
        }
    

    当我尝试执行它时,我有以下异常: java.security.cert.CertificateException


    这是完整的异常堆栈:

    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
    

    CertificateOverview的第98行。java是

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

    2 回复  |  直到 7 年前
        1
  •  6
  •   Markus Weninger    7 年前

    CertificateFactory#generateCertificate 它说:

    抛出:CertificateException-解析错误。

    因此,正如注释中所建议的,您的证书文件很可能不是预期的格式。

    尤其值得注意的是,文件中的以下行:

    对于X.509证书的证书工厂,inStream中提供的证书必须进行DER编码,并且可以二进制或可打印(Base64)编码提供。如果证书是以Base64编码提供的,则它必须在开始处由------BEGIN certificate------绑定,并且必须在结束处由------end certificate------绑定。

    如果您发布了一个异常堆栈,其中包含详细的异常消息,我们可能可以提供更多帮助。

        2
  •  1
  •   ISparkes DAXaholic    4 年前

    如果定义了密钥库,请确保它位于您定义的位置,并且应用程序可以读取它。

    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]