3.4 Windows証明書ストアから、ルート証明書を取り出す

 Javaの環境およびWindows環境では、それぞれ独自に証明書のストアを持っています。残念ながらそれぞれ互いにデータ交換を行うことができません。
 ここでは、Windows用のJNI-DLLを利用して、Java環境からWindowsの証明書ストアに格納されたルートの電子証明書を取り出します。電子署名に使われた電子証明書は、ここで取り出した電子証明書で検証します。

以下は、電子署名データ(PKCS#7形式)から含まれている電子証明書をすべて取り出し、それぞれのルート証明書をWindowsの証明書ストアから検索し受け取ります。ただし、ルート電子証明書は、「信頼されたルート証明機関」なる証明書ストアから取り出しますので、ここに格納されていない場合や、中間のCA証明書の場合は、取り出せませんので注意してください。
import java.io.*;
import java.util.*;
import java.security.cert.CertPath;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;

public class Signature {

    public native byte[] getCaCertificate(byte cert[]);

    static {
        System.loadLibrary("Signature");
    }

    public static void main(String[] args) {
        try {
            FileInputStream fis = new FileInputStream("sign.p7s");
            CertificateFactory cf =
                        CertificateFactory.getInstance("X.509");
            CertPath cp = cf.generateCertPath(fis, "PKCS7");

            List certs = cp.getCertificates();
            Iterator i = certs.iterator();
            while (i.hasNext()) {
                X509Certificate cert = (X509Certificate)i.next();
                System.out.println(cert);
                byte issCert[] =
                        new Signature().getCaCertificate(cert.getEncoded());

                //      受け取った証明書
                System.out.println("ルート電子証明書");
                CertificateFactory cf2 =
                        CertificateFactory.getInstance("X.509");
                ByteArrayInputStream bais =
                        new ByteArrayInputStream(issCert);
                X509Certificate cert2 =
                        (X509Certificate)cf2.generateCertificate(bais);
                System.out.println(cert2);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
このサンプルには、Signature.dllが必要です。学習目的であれば、以下からダウンロードしてください。

署名データに格納された電子証明書ごとに、そのルート電子証明書が取り出され表示されます。関数getCaCertificate( )には、エンコードされた電子証明書データをbyte配列データで渡してください。戻り値として、ルート電子証明書のエンコードされたデータがbyte配列データで戻されます。エンコードされた電子証明書データは、ByteArrayInputStreamクラスやgenerateCertificate( )を使ってX509証明書インスタンスを取得します。
このインスタンスを使えば、電子証明書の記載内容を表示させることができます。また、検証の際にはこの電子証明書も検証します。

3.5 DLLおよびサンプルコード

DLLは、個人でのJavaによる電子署名等の学習用途に限って利用する事を許諾しますので、それ以外の目的で使用することはできません。
個人使用目的であれば、
ここからダウンロードして利用してください。
なお、このDLLは、Windows95SE以上の環境で動作しますが、WindowsXPでのみ動作を検証しています。

サンプルコードは、ここからダウンロードしてください。
サンプルコードの商業利用および転載を禁止します。

 ご質問・ご要望

 ご質問やご要望は、こちらからお送りください。(匿名でも可能です。)

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

PDF-Tools
PDFおよびPDF/Aを作成・編集などができるJavaで使えるライブラリ
128ビットの暗号化や電子署名に対応
http:
//www.trustss.co.jp/pdf/
3. Javaによる 電子署名の検証
3.1 概要
3.2 電子署名されたデータ
3.3 署名されたデータから電子証明書を取り出す
3.4 Windows証明書ストアから、ルート証明書を取り出す
3.5 DLLおよびサンプルコード
Java 暗号化
1. Java暗号化拡張機能による暗号
1.2 共通鍵方式(秘密鍵)での暗号化
1.3 Java暗号とWindows暗号の連携
1.4 JCE 暗号を無制限強度にする
1. Java暗号化拡張機能による暗号
1.1 概要
1.2 共通鍵方式(秘密鍵)での暗号化
1.2.1 暗号化と復号 (自動生成鍵による)
1.2.2 暗号鍵を指定して暗号化する
1.2.3 パスワードなどから暗号鍵を生成する
1.2.4 パスワードベース暗号化(PBE)方式
 
1.3 Java暗号とWindows暗号の連携
1.3.1 概要
1.3.2 Javaで暗号化する
1.3.3 Windows APIで復号する
1.3.4 Windowsで暗号化する
1.3.5 Javaで復号する
 
1.4 JCE 暗号を無制限強度にする
参考
Windows CryptoAPIによる暗号化
Windowsの新しい暗号化API
XML文書の暗号化
XML文書への電子署名(Java)
XML文書への電子署名(C#)
株)トラスト・ソフトウェア・システム
暗号化・電子署名・タイムスタンプ ライブラリ作成します。
お問い合わせください。
会員用ログイン
ID:
パスワード:
ログインすると、一般公開していないページを閲覧できます。