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バイナリで表現します。
指定の鍵を使って、指定した要素を親として署名データが作成されるようになります。
ここで、上記で指定されたとおりに署名文書が作成されます。
お問い合わせは、こちらからお願いします。
(記載の会社名および製品名は、各社の登録商標および商標です。)