4.XML文書に署名する (Java)
4.4 電子署名のJavaアプリケーション
Enveloped署名するアプリケーションです。暗号の鍵はDSA公開鍵を生成して利用します。
各処理の詳細は、次のページで説明します。
各処理の詳細は、次のページで説明します。
import javax.xml.crypto.*; import javax.xml.crypto.dsig.*; import javax.xml.crypto.dom.*; import javax.xml.crypto.dsig.dom.DOMSignContext; import javax.xml.crypto.dsig.keyinfo.*; import javax.xml.crypto.dsig.spec.*; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.OutputStream; import java.security.*; import java.util.Collections; import java.util.Iterator; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.*; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; public class Enveloped { public static void main(String[] args) throws Exception { // Enveloped署名データを作成するためのDOM XMLSignatureFactoryを生成します XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM"); // (11)<Reference>のためのインスタンスを生成します Reference ref = fac.newReference( "", fac.newDigestMethod(DigestMethod.SHA1, null), Collections.singletonList( fac.newTransform( Transform.ENVELOPED, (TransformParameterSpec)null)), null, null); // (12)<SignedInfo>のためのインスタンスを生成します SignedInfo si = fac.newSignedInfo( fac.newCanonicalizationMethod( CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS, (C14NMethodParameterSpec)null), fac.newSignatureMethod(SignatureMethod.DSA_SHA1,null), Collections.singletonList(ref)); // (13)DSA 鍵ペアを生成します KeyPairGenerator kpg = KeyPairGenerator.getInstance("DSA"); kpg.initialize(512); KeyPair kp = kpg.generateKeyPair(); // <KeyValue>のためのインスタンスを生成します // <KeyValue>には生成した鍵ペアから公開鍵を格納します KeyInfoFactory kif = fac.getKeyInfoFactory(); KeyValue kv = kif.newKeyValue(kp.getPublic()); // (14)<KeyInfo>のためのインスタンスを生成し、鍵を格納します KeyInfo ki = kif.newKeyInfo(Collections.singletonList(kv)); // 署名するXMLを格納するためのインスタンスを生成します // ここでのインスタンスは、署名される文書から生成されます DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); Document doc = dbf.newDocumentBuilder().parse(new FileInputStream("org.xml")); // (15)DOMSignContextを生成します // このとき、私有鍵と親要素を指定します DOMSignContext dsc = new DOMSignContext(kp.getPrivate(), doc.getDocumentElement()); // XML署名のインスタンスを生成し、署名情報と鍵情報を指定します // この時点では、署名されません XMLSignature signature = fac.newXMLSignature(si, ki); // (16)ここで署名します signature.sign(dsc); // 署名したXML文書をファイルに格納します OutputStream os = new FileOutputStream("Enveloped.xml"); TransformerFactory tf = TransformerFactory.newInstance(); Transformer trans = tf.newTransformer(); trans.transform(new DOMSource(doc), new StreamResult(os)); } }
- (11) <Reference>を構成します
- (12) <SignedInfo>を構成します
- (13) 新規にDSA鍵ペアを生成します
- (14) <KeyInfo>を構成します
- (15) DOMSignContextを生成します
- (16) XML署名を実施します
<Reference>には、属性を指定できます。Enveloped署名ですので、文書全体(親要素)を表す""(空文字)を指定します。
この要素には、変換アルゴリズム(<Transforms>)、ダイジェストメソッド(<DigetstMethod>)、ダイジェスト値(<DigestValue>)などの要素を含めることができます。
詳しくは、4.5.1 <Reference>を構成する を参照してください。
この要素には、変換アルゴリズム(<Transforms>)、ダイジェストメソッド(<DigetstMethod>)、ダイジェスト値(<DigestValue>)などの要素を含めることができます。
詳しくは、4.5.1 <Reference>を構成する を参照してください。
<SignedInfo>には、正規化方法(<CanonicalizationMethod>)、署名方法(<SignatureMethod>)、上記で構成した<Reference>要素などを含めます。
ここで生成された公開鍵は、<KeyValue>要素に含めます。私有鍵は、ダイジェスト値を暗号化するのに使用されます。
<KeyInfo>には、上記で構成した<KeyValue>要素などを含めます。鍵値は、Base64バイナリで表現します。
指定の鍵を使って、指定した要素を親として署名データが作成されるようになります。
ここで、上記で指定されたとおりに署名文書が作成されます。
お問い合わせは、こちらからお願いします。
(記載の会社名および製品名は、各社の登録商標および商標です。)