Konnte nicht analysiert Zertifikat: java.io.IOException: Leere Eingabe X509Certificate
Bin ich immer die Fehler, die unten gegeben werden, beim Parsen der Signatur. Jemand hat Idee, warum der Fehler zeigt?
Beachten Sie, dass:
- Verwenden das gleiche Zertifikat habe ich unterschrieben, meine eigene XML und überprüft die ist in Ordnung. Das bedeutet, dass es ist kein Problem mit Zertifikat.
- Client signierten Dokuments nicht überprüfen.
Fehler:
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)
Sie den code hier zur Referenz
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");
}
}
}
Vielen Dank für die Antworten,ja ich habe den code in der Frage selbst. Seinen Fehler beim unmarshal geschieht nur für den Kunden signierte xml.Aber wenn ich alle nicht signierten xml-Datei mit dem gleichen Zertifikat unterzeichnen und zu validieren, es gibt obige Fehlermeldung.
sehen Sie [hier][1] [1]: stackoverflow.com/questions/10594000/... ich denke, es wird Ihr problem lösen.
1.Vielen Dank für die Beantwortung aber es ist im Zusammenhang mit SSL-Verbindung, die ich nicht brauche,2.Dies ist früheren Kommentar Bearbeiten", Aber wenn ich alle nicht signierten xml-Datei mit dem gleichen Zertifikat,Unterzeichnung und Validierung ist es, zu arbeiten." typo-Problem.
sehen Sie [hier][1] [1]: stackoverflow.com/questions/10594000/... ich denke, es wird Ihr problem lösen.
1.Vielen Dank für die Beantwortung aber es ist im Zusammenhang mit SSL-Verbindung, die ich nicht brauche,2.Dies ist früheren Kommentar Bearbeiten", Aber wenn ich alle nicht signierten xml-Datei mit dem gleichen Zertifikat,Unterzeichnung und Validierung ist es, zu arbeiten." typo-Problem.
InformationsquelleAutor Sam | 2015-07-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist schon eine Weile her dieser post, aber ich kam hier auf der Suche für dieses Problem. In meinem Fall war der Schlüssel, das Zertifikat war in einen Base64-String.getBytes[] anstelle eines DEKODIERTEN Base64-String.getBytes[].
Hoffe, es hilft jemandem 🙂
Ja, sicher! Das Problem in meinem Fall war, dass ich versucht hatte, Sie zu analysieren, um eine X509Certificate aus einem String, es war nicht ein X509Certificate. Es war ein Base64-string enthält die Daten des Zertifikats, so dass, um zu analysieren, hatte ich zum decodieren der Zeichenfolge, die zuvor und anschließend analysiert werden, um ein X509.
Um dies zu verdeutlichen eine weitere, die ich verwendet
Base64.getDecoder().decode(certString)
erfolgreich, wenn ich erhielt diese Fehlermeldung.InformationsquelleAutor israelC
Nachdem man durch so viele blogs nichts geholfen, als solche. Schließlich bestätigte uns der Weg client tut seine Verschlüsselung und die gleichen Gläser verwendet werden, die für unsere Prüfung. Ich bin nicht sicher, ob dies korrekt ist Antwort oder nicht, aber helfen kann, jemanden, der hart versucht, um dieses Problem zu beheben.
Es kann Ihnen einige Ahnung, wenn nicht lösen können, über Fehler, nachdem Sie durch viele Seiten.
So versuchen, dieselben Gläser, welche für die client-Verschlüsselung und Holen Sie sich die kompatiblen privaten Schlüssel für den öffentlichen Schlüssel und fügen Sie pk12-Datei. Konvertieren pk12, jks, die Sie verwenden können für die Verschlüsselung und Verifizierung zu, die gelöst unser Problem.
Einige Prozess zu
Viel Glück Jungs.
InformationsquelleAutor Sam