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>を構成します
  • <Reference>には、属性を指定できます。Enveloped署名ですので、文書全体(親要素)を表す""(空文字)を指定します。
    この要素には、変換アルゴリズム(<Transforms>)、ダイジェストメソッド(<DigetstMethod>)、ダイジェスト値(<DigestValue>)などの要素を含めることができます。
    詳しくは、4.5.1 <Reference>を構成する を参照してください。
  • (12) <SignedInfo>を構成します
  • <SignedInfo>には、正規化方法(<CanonicalizationMethod>)、署名方法(<SignatureMethod>)、上記で構成した<Reference>要素などを含めます。
  • (13) 新規にDSA鍵ペアを生成します
  • ここで生成された公開鍵は、<KeyValue>要素に含めます。私有鍵は、ダイジェスト値を暗号化するのに使用されます。
  • (14) <KeyInfo>を構成します
  • <KeyInfo>には、上記で構成した<KeyValue>要素などを含めます。鍵値は、Base64バイナリで表現します。
  • (15) DOMSignContextを生成します
  • 指定の鍵を使って、指定した要素を親として署名データが作成されるようになります。
  • (16) XML署名を実施します
  • ここで、上記で指定されたとおりに署名文書が作成されます。

お問い合わせは、こちらからお願いします。



(記載の会社名および製品名は、各社の登録商標および商標です。)

4.1 XML文書に署名する (Java)
4.1 XML署名とは
4.2 署名されるXML文書
4.3 署名されたXML文書(結果)
4.4 電子署名 Javaアプリ
株)トラスト・ソフトウェア・システム
暗号化・電子署名・タイムスタンプ ライブラリ作成します。
お問い合わせください。
会員用ログイン
ID:
パスワード:
ログインすると、一般公開していないページを閲覧できます。