title: Could not parse certificate: java.io.IOException: Empty input X509Certificate
body: <p>I am getting the error given below when parsing the signature. Anybody has idea why the error is showing?</p>
  
  <p>Note that: </p>
  
  <ol>
  <li><p>Using the same certificate I signed my own XML and verified which is working fine. That mean there is no issue with certificate.</p></li>
  <li><p>Client provided signed document not able to validate.</p></li>
  </ol>
  
  <p>Errors:</p>
  
  <pre><code>Exception in thread "main" javax.xml.crypto.MarshalException: Cannot create X509Certificate
  at org.jcp.xml.dsig.internal.dom.DOMX509Data.unmarshalX509Certificate(DOMX509Data.java:225)
  at org.jcp.xml.dsig.internal.dom.DOMX509Data.&lt;init&gt;(DOMX509Data.java:116)
  at org.jcp.xml.dsig.internal.dom.DOMKeyInfo.&lt;init&gt;(DOMKeyInfo.java:116)
  at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.&lt;init&gt;(DOMXMLSignature.java:150)
  at org.jcp.xml.dsig.internal.dom.DOMXMLSignatureFactory.unmarshal(DOMXMLSignatureFactory.java:173)
  at org.jcp.xml.dsig.internal.dom.DOMXMLSignatureFactory.unmarshalXMLSignature(DOMXMLSignatureFactory.java:137)
  at com.signing.ValidateSignedXML.main(ValidateSignedXML.java:126)
  Caused by: java.security.cert.CertificateException: Could not parse certificate: java.io.IOException: Empty input
  at sun.security.provider.X509Factory.engineGenerateCertificate(X509Factory.java:104)
  at java.security.cert.CertificateFactory.generateCertificate(CertificateFactory.java:339)
  at org.jcp.xml.dsig.internal.dom.DOMX509Data.unmarshalX509Certificate(DOMX509Data.java:223)
  ... 6 more
  Caused by: java.io.IOException: Empty input
  at sun.security.provider.X509Factory.engineGenerateCertificate(X509Factory.java:101)
  </code></pre>
  
  <p><strong>Adding the code here for reference</strong> </p>
  
  <pre><code>package com.signing;
  
  import java.io.FileInputStream;
  import java.security.KeyStore;
  import java.security.cert.X509Certificate;
  import java.util.Iterator;
  
  import javax.xml.crypto.dsig.Reference;
  import javax.xml.crypto.dsig.XMLSignature;
  import javax.xml.crypto.dsig.XMLSignatureFactory;
  import javax.xml.crypto.dsig.dom.DOMValidateContext;
  import javax.xml.parsers.DocumentBuilderFactory;
  
  import org.w3c.dom.Document;
  import org.w3c.dom.Node;
  import org.w3c.dom.NodeList;
  
  public class ValidateSignedXML {
  
      /**
       * @param args
       * @throws Exception 
       */
  /**
       * @param args
       * @throws Exception 
       */
      public static void main(String[] args) throws Exception {
          // TODO Auto-generated method stub
  
          // Load the KeyStore and get the signing key and certificate.
          KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
          ks.load(new FileInputStream("C:\\Program Files\\Java\\jre1.8.0_31\\bin\\newstore8.jks"), "changeit7".toCharArray());
  
  
          KeyStore.PrivateKeyEntry keyEntry =
              (KeyStore.PrivateKeyEntry) ks.getEntry
                  ("newkey8", new KeyStore.PasswordProtection("changeit7".toCharArray()));
          X509Certificate cert = (X509Certificate) keyEntry.getCertificate();
          XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");
  
  
          //Load the signed document.
          DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
          dbf.setNamespaceAware(true);
          Document doc = dbf.newDocumentBuilder().parse
              (new FileInputStream("C:\\src\\com\\signing\\signed.xml"));
  
  
          // Find Signature element.
          NodeList nl =
              doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature");
          if (nl.getLength() == 0) {
              throw new Exception("Cannot find Signature element");
          }else{
              /*System.out.println("---- Start of Print Tag ----\n");
              for(int k=0;k&lt;nl.getLength();k++){
                   printTags((Node)nl.item(k));
               }
              System.out.println("---- End of Print Tag ----\n");*/
          }
  
          // Create a DOMValidateContext and specify a KeySelector
          // and document context.
          DOMValidateContext valContext = new DOMValidateContext
              (new X509KeySelector(), nl.item(0));
  
          // Unmarshal the XMLSignature.
          XMLSignature signatures = fac.unmarshalXMLSignature(valContext);
  
          // Validate the XMLSignature.
          boolean coreValidity = signatures.validate(valContext);
  
          System.out.println("Signature Validate :"+coreValidity);
  
          // Check core validation status.
          if (coreValidity == false) {
              String validateError;
              validateError = "Signature core validation status:false";
              boolean sv = signatures.getSignatureValue().validate(valContext);
              validateError = validateError + " | Signature validation status:" + sv;
              if (sv == false || true) {
                  validateError = validateError + " | References: ";
                  // Check the validation status of each Reference.
                  Iterator g = signatures.getSignedInfo().getReferences().iterator();
                  for (int j = 0; g.hasNext(); j++) {
  
                      Reference r = (Reference) g.next();
                      boolean refValid = r.validate(valContext);
                      validateError = validateError + "{ref[" + r.getURI() + "] validity status: " + refValid + "}";
                  }
              }
              throw new Exception(validateError);
          } else {
              System.out.println("Signature passed core validation");
          }
  
      }
  
  }
  </code></pre>