javaでXMLに電子署名を行うメソッドを実装しているのですが、signature.sign(dsc);の箇所で、
ResourceResolverException: Cannot resolve element with ID
というエラーが出てしまい、署名に失敗してしまいます。
いったんXMLSignatureExceptionをスルーし、xml出力を行うと、DigestValue,SignatureValueが空で出力されます。上記エラーと関連しているかもしれません。
調べてみたところ、jdkのバグだという記事を見かけましたが、いまいち改善の方法が分かりません。
https://bugs.openjdk.java.net/browse/JDK-8017169
取り急ぎ、上記エラーが出なくなるにはどうすれば良いか、どなたか教えていただけないでしょうか。
##実装の参考にしたURL
JavaのXMLデジタル署名APIを利用してXML署名
##環境
Java7
##ソース
java
1// 関係しそうなimport文のみ抜粋して載せています 2import java.io.UnsupportedEncodingException; 3import java.security.InvalidAlgorithmParameterException; 4import java.security.KeyException; 5import java.security.KeyStore; 6import java.security.KeyStoreException; 7import java.security.NoSuchAlgorithmException; 8import java.security.UnrecoverableKeyException; 9import java.security.cert.CertificateException; 10import java.security.cert.X509Certificate; 11import java.security.interfaces.RSAPrivateKey; 12import javax.enterprise.context.ApplicationScoped; 13import javax.inject.Inject; 14import javax.xml.crypto.MarshalException; 15import javax.xml.crypto.dsig.CanonicalizationMethod; 16import javax.xml.crypto.dsig.DigestMethod; 17import javax.xml.crypto.dsig.Reference; 18import javax.xml.crypto.dsig.SignedInfo; 19import javax.xml.crypto.dsig.Transform; 20import javax.xml.crypto.dsig.XMLSignature; 21import javax.xml.crypto.dsig.XMLSignatureException; 22import javax.xml.crypto.dsig.XMLSignatureFactory; 23import javax.xml.crypto.dsig.dom.DOMSignContext; 24import javax.xml.crypto.dsig.keyinfo.KeyInfo; 25import javax.xml.crypto.dsig.keyinfo.KeyInfoFactory; 26import javax.xml.crypto.dsig.keyinfo.X509Data; 27import javax.xml.crypto.dsig.spec.C14NMethodParameterSpec; 28import javax.xml.crypto.dsig.spec.TransformParameterSpec; 29import javax.xml.parsers.DocumentBuilder; 30import javax.xml.parsers.DocumentBuilderFactory; 31import javax.xml.parsers.FactoryConfigurationError; 32import javax.xml.parsers.ParserConfigurationException; 33import javax.xml.transform.OutputKeys; 34import javax.xml.transform.Transformer; 35import javax.xml.transform.TransformerException; 36import javax.xml.transform.TransformerFactory; 37import javax.xml.transform.dom.DOMSource; 38import javax.xml.transform.stream.StreamResult; 39import org.dom4j.DocumentException; 40import org.dom4j.Node; 41import org.dom4j.io.SAXReader; 42import org.slf4j.Logger; 43import org.slf4j.LoggerFactory; 44import org.w3c.dom.Document; 45import org.w3c.dom.Element; 46import org.w3c.dom.ProcessingInstruction; 47import org.xml.sax.InputSource; 48import org.xml.sax.SAXException; 49 50 public String createXml() 51 throws Exception { 52 53 // Documentインスタンスの生成 54 DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 55 Document document = documentBuilder.newDocument(); 56 57 // スタイルシート追加 58 ProcessingInstruction pi = document.createProcessingInstruction("xml-stylesheet", 59 "type=\"text/xsl\" href=\"http://XXXXXXX/XXX/XXX/XXXXX.xsl\""); 60 document.appendChild(pi); 61 62 Element teg = document.createElement("AAAAAA"); 63 teg.setAttribute("xmlns", "XXXXX"); 64 teg.setAttribute("id", "abc"); 65 66 try { 67 // 証明書をキーストアから再取得する 68 x509cert = getCertificate(keyStore, alias); 69 70 // 秘密鍵を取得 71 RSAPrivateKey privateKey = (RSAPrivateKey) keyStore.getKey(alias, certificatePassArray); 72 73 // 署名コンテキストの作成 74 DOMSignContext dsc = new DOMSignContext(privateKey, document.getDocumentElement()); 75 76 XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM"); 77 78 // 参照要素の作成 79 Reference ref = fac.newReference 80 ("#AAAAAA", fac.newDigestMethod(DigestMethod.SHA256, null), 81 Collections.singletonList 82 (fac.newTransform(Transform.ENVELOPED, 83 (TransformParameterSpec) null)), null, null); 84 85 // 署名情報の作成 86 SignedInfo si = fac.newSignedInfo 87 (fac.newCanonicalizationMethod 88 (CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS, 89 (C14NMethodParameterSpec) null), 90 fac.newSignatureMethod("http://www.w3.org/2000/09/xmldsig#rsa-sha1", null), 91 Collections.singletonList(ref)); 92 93 KeyInfoFactory kif = fac.getKeyInfoFactory(); 94 X509Data x509Data = kif.newX509Data(Collections.singletonList(x509cert)); 95 KeyInfo ki = kif.newKeyInfo(Collections.singletonList(x509Data)); 96 97 // 署名する. 98 XMLSignature signature = fac.newXMLSignature(si, ki); 99 signature.sign(dsc); 100 101 } catch (XMLSignatureException e) { 102 // ResourceResolverException: Cannot resolve element with ID AAAAAA エラーが出る 103 throw new XMLSignatureException(e); 104 } catch (MarshalException e) { 105 throw new MarshalException(e); 106 } catch (InvalidAlgorithmParameterException e) { 107 throw new InvalidAlgorithmParameterException(e); 108 } catch (NoSuchAlgorithmException e) { 109 throw new NoSuchAlgorithmException(e); 110 } catch (KeyStoreException e) { 111 throw new KeyStoreException(e); 112 } catch (CertificateException e) { 113 throw new CertificateException(e); 114 } catch (UnrecoverableKeyException e) { 115 throw new UnrecoverableKeyException(); 116 } 117 }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/17 03:22