質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

4282閲覧

【Java】電子署名に失敗する

irohamaru

総合スコア15

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/11/14 03:35

編集2017/11/14 04:33

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 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

いくつか実装が書かれていないメソッドや変数がありますので、キーストアからX509証明書や秘密鍵が取得できている前提で確認しました。

実は、もっと手前の問題かと思われます。

java

1Element teg = document.createElement("AAAAAA");

で生成した要素がdocumentに追加されていないので、後続の

java

1 Reference ref = fac.newReference 2 ("#AAAAAA", fac.newDigestMethod(DigestMethod.SHA256, null),

でAAAAAA要素を参照しようとしても、対象のXMLには要素が含まれていないので参照できないのではないでしょうか。

java

1document.appendChild(teg);

で要素を追加してあげれば参照できるのでは。

※余談ですが、teg ではなく、tag でしょうか。

投稿2017/11/14 11:12

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

irohamaru

2017/11/17 03:22

@A-pZさん 検証してみたところ、ご指摘のとおりでした。 丁寧な解説ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問