3.4 Windows証明書ストアから、ルート証明書を取り出す
Javaの環境およびWindows環境では、それぞれ独自に証明書のストアを持っています。残念ながらそれぞれ互いにデータ交換を行うことができません。
ここでは、Windows用のJNI-DLLを利用して、Java環境からWindowsの証明書ストアに格納されたルートの電子証明書を取り出します。電子署名に使われた電子証明書は、ここで取り出した電子証明書で検証します。
以下は、電子署名データ(PKCS#7形式)から含まれている電子証明書をすべて取り出し、それぞれのルート証明書をWindowsの証明書ストアから検索し受け取ります。ただし、ルート電子証明書は、「信頼されたルート証明機関」なる証明書ストアから取り出しますので、ここに格納されていない場合や、中間のCA証明書の場合は、取り出すことができませんので注意してください。
ここでは、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証明書インスタンスを取得します。
このインスタンスを使えば、電子証明書の記載内容を表示させることができます。また、検証の際には公開鍵を取り出して署名に使った電子証明書を検証します。
署名データに格納された電子証明書ごとに、そのルート電子証明書が取り出され表示されます。関数getCaCertificate( )には、エンコードされた電子証明書データをbyte配列データで渡してください。戻り値として、ルート電子証明書のエンコードされたデータがbyte配列でーたで戻されます。エンコードされた電子証明書データは、ByteArrayInputStreamクラスやgenerateCertificate( )を使ってX509証明書インスタンスを取得します。
このインスタンスを使えば、電子証明書の記載内容を表示させることができます。また、検証の際には公開鍵を取り出して署名に使った電子証明書を検証します。
3.5 DLLおよびサンプルコード
DLLは、個人でのJavaによる電子署名等の学習用途に限って利用する事を許諾しますので、それ以外の目的で使用することはできません。
個人使用目的であれば、ここからダウンロードして利用してください。
なお、このDLLは、Windows95SE以上の環境で動作しますが、WindowsXPでのみ動作を検証しています。
サンプルコードは、ここからダウンロードしてください。
サンプルコードの商業利用および転載を禁止します。
個人使用目的であれば、ここからダウンロードして利用してください。
なお、このDLLは、Windows95SE以上の環境で動作しますが、WindowsXPでのみ動作を検証しています。
サンプルコードは、ここからダウンロードしてください。
サンプルコードの商業利用および転載を禁止します。
ご質問・ご要望
ご質問やご要望は、こちらからお送りください。(匿名でも可能です。)
(記載の会社名および製品名は、各社の登録商標および商標です。)