【问题标题】:Could not parse certificate: java.io.IOException: Empty input X509Certificate无法解析证书:java.io.IOException:空输入 X509Certificate
【发布时间】:2019-12-20 01:23:45
【问题描述】:

解析签名时出现以下错误。有人知道为什么会显示错误吗?

注意:

  1. 使用相同的证书我签署了我自己的 XML 并验证了它工作正常。这意味着证书没有问题。

  2. 客户提供的签名文件无法验证。

错误:

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.<init>(DOMX509Data.java:116)
at org.jcp.xml.dsig.internal.dom.DOMKeyInfo.<init>(DOMKeyInfo.java:116)
at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.<init>(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)

在此添加代码供参考

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

    }

}

【问题讨论】:

  • 感谢您的回复,是的,我自己添加了有问题的代码。仅针对客户端签名的 xml 进行解组时失败。但是如果我使用任何具有相同证书的未签名 xml 文件,请签名并验证它是否给出上述错误。
  • 看[这里][1] [1]:stackoverflow.com/questions/10594000/…我想它会解决你的问题。
  • 1.感谢您的回复,但它与我不需要的 SSL 连接有关,2.这是之前的评论编辑“但如果我使用任何具有相同证书的未签名 xml 文件,请签名并验证它是在职的。”错字问题。
  • XML 中的证书为空。 XML 是什么样的?它是如何创建的?

标签: java rsa x509certificate x509 signing


【解决方案1】:

这篇文章已经有一段时间了,但我来这里是为了寻找这个问题。就我而言,关键是证书位于 Base64-String.getBytes[] 而不是 DECODED-Base64-String.getBytes[] 中。

希望它可以帮助某人:)

【讨论】:

  • 嗨,你能再澄清一下吗?
  • 是的,当然!我的问题是我试图从不是 X509Certificate 的字符串中解析为 X509Certificate。这是一个包含证书数据的 Base64 字符串,因此为了解析它,我必须先解码该字符串,然后将其解析为 X509。
  • 为了进一步澄清这一点,我在收到此错误消息时成功使用了Base64.getDecoder().decode(certString)
【解决方案2】:

浏览了这么多博客后,没有任何帮助。最后,我们确认了客户进行加密的方式,并使用了与我们验证相同的 jar。我不确定这是否是正确的答案,但可能会帮助那些努力解决这个问题的人。 如果在浏览许多站点后无法解决上述错误,它可能会给您一些线索。 因此,请尝试使用与客户端加密相同的 jar,并为您的公钥获取兼容的私钥并添加到 pk12 文件中。将 pk12 转换为 jks,您也可以将其用于加密和验证,从而解决了我们的问题。 还有一些过程

#**Create PKCS12 keystore from private key and public certificate.**
openssl pkcs12 -export -name myservercert -in selfsigned.crt -inkey server.key -out keystore.p12
#**Convert PKCS12 keystore into a JKS keystore**
keytool -importkeystore -destkeystore mykeystore.jks -srckeystore keystore.p12 -srcstoretype pkcs12 -alias myservercer

祝大家好运。

【讨论】:

  • 这些都不能解决 XML 中的空证书。
【解决方案3】:

错误可能很简单,因为您的证书集中没有 BEGINEND 标记。

-----BEGIN CERTIFICATE-----
your cert data here
-----END CERTIFICATE-----

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 2022-10-07
    • 2017-05-14
    • 1970-01-01
    • 2016-02-17
    相关资源
    最近更新 更多