Java 数字签名代码仅在AIX上失败
我有以下代码对输入XML文件进行数字签名。出于某种原因,它可以在Windows和Solaris上工作,但无论XML内容是什么,它在AIX上总是失败Java 数字签名代码仅在AIX上失败,java,dom,digital-signature,Java,Dom,Digital Signature,我有以下代码对输入XML文件进行数字签名。出于某种原因,它可以在Windows和Solaris上工作,但无论XML内容是什么,它在AIX上总是失败 public class Test { public static void main(String[] args) throws Exception { KeyStore keyStore = KeyStore.getInstance("JKS"); FileInputStream file
public class Test {
public static void main(String[] args) throws Exception {
KeyStore keyStore = KeyStore.getInstance("JKS");
FileInputStream fileInputStream = new FileInputStream(args[0]);
keyStore.load(fileInputStream, "password".toCharArray());
String alias = keyStore.aliases().nextElement();
PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, "password".toCharArray());
byte[] signed = createDigitalSignature(args[1], null, privateKey);
FileOutputStream fileOutputStream = new FileOutputStream(args[2]);
fileOutputStream.write(signed);
fileOutputStream.close();
}
public static byte[] createDigitalSignature(String inputFileName, String certificateFileName, PrivateKey privateKey) throws Exception {
XMLSignatureFactory signatureFactory = XMLSignatureFactory.getInstance("DOM");
Transform transform = signatureFactory.newTransform("http://www.w3.org/2001/10/xml-exc-c14n#", (TransformParameterSpec) null);
Reference reference = signatureFactory.newReference("#XXX", signatureFactory.newDigestMethod("http://www.w3.org/2001/04/xmlenc#sha256", null), Collections.singletonList(transform), null, null);
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);
documentBuilderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
Document document = documentBuilderFactory.newDocumentBuilder().parse(new FileInputStream(inputFileName));
XMLStructure structure = new DOMStructure(document.getDocumentElement());
XMLObject object = signatureFactory.newXMLObject(Collections.singletonList(structure), "XXX", null, null);
SignatureMethod signatureMethod = signatureFactory.newSignatureMethod("http://www.w3.org/2001/04/xmldsig-more#rsa-sha256", null);
CanonicalizationMethod canonicalizationMethod = signatureFactory.newCanonicalizationMethod("http://www.w3.org/2001/10/xml-exc-c14n#", (C14NMethodParameterSpec)null);
SignedInfo signedInfo = signatureFactory.newSignedInfo(canonicalizationMethod, signatureMethod, Collections.singletonList(reference));
KeyInfo keyInfo = null;
if (certificateFileName != null) {
FileInputStream fileInputStream = new FileInputStream(certificateFileName);
CertificateFactory factory = CertificateFactory.getInstance("X.509");
X509Certificate certificate = (X509Certificate) factory.generateCertificate(fileInputStream);
ArrayList<Object> x509Content = new ArrayList<Object>();
x509Content.add(certificate.getSubjectX500Principal().getName());
x509Content.add(certificate);
KeyInfoFactory keyInfoFactory = signatureFactory.getKeyInfoFactory();
X509Data xd = keyInfoFactory.newX509Data(x509Content);
keyInfo = keyInfoFactory.newKeyInfo(Collections.singletonList(xd));
}
XMLSignature signature = signatureFactory.newXMLSignature(signedInfo, keyInfo, Collections.singletonList(object), null, null);
DOMSignContext signContext = new DOMSignContext(privateKey, document);
signature.sign(signContext);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
transformer.transform(new DOMSource(document), new StreamResult(byteArrayOutputStream));
return byteArrayOutputStream.toByteArray();
}
}
它被抛出行:signature.sign(signContext)
有什么问题吗?我有一个简单的XML文件
<?xml version="1.0" encoding="UTF-8" ?>
<a>
</a>
但它仍然失败,只有在AIX上
<?xml version="1.0" encoding="UTF-8" ?>
<a>
</a>