Java の暗号化ルーチンに関するヘルプが必要です。
PKCS#7 署名が与えられた場合、そこに含まれるすべての証明書を信頼できるストアに対して検証したいと考えています。署名に含まれるすべての証明書は、有効な証明書パス (またはチェーンなど) を形成する正しい順序になっていると想定しているため、
- 最上位 (#0) は署名証明書です。
- 次のもの (#1) は #0 の署名に使用される中間証明書です。
- 次のもの (#2) は別の中間証明書で、#1 の署名に使用されます。
- 等々。
最後の証明書 (#N) は CA によって署名されています。
それが私がこれまでハッキングできたものです:
// Exception handling skipped for readability
//byte[] signature = ...
pkcs7 = new PKCS7(signature); // `sun.security.pkcs.PKCS7;`
// *** Checking some PKCS#7 parameters here
X509Certificate prevCert = null; // Previous certificate we've found
X509Certificate[] certs = pkcs7.getCertificates(); // `java.security.cert.X509Certificate`
for (int i = 0; i < certs.length; i++) {
// *** Checking certificate validity period here
if (cert != null) {
// Verify previous certificate in chain against this one
prevCert.verify(certs[i].getPublicKey());
}
prevCert = certs[i];
}
//String keyStorePath = ...
KeyStore keyStore = KeyStore.getInstance("JKS"); // `java.security.KeyStore`
keyStore.load(new FileInputStream(keyStorePath), null);
// Get trusted VeriSign class 1 certificate
Certificate caCert = keyStore.getCertificate("verisignclass1ca"); // `java.security.cert.Certificate`
// Verify last certificate against trusted certificate
cert.verify(caCert.getPublicKey());
問題は、標準の Java クラスのようなものを使用してこれを行うにはどうすればよいかということCertPath
です。私は自転車を再発明しているという強い気持ちを持っています。または、誰かが BouncyCastle ライブラリの例を持っていれば、それも問題ありません。
おまけの質問: ルート証明書が自動的に選択されるように、信頼できるストアに対して証明書を検証する方法は?