X509 証明書をいくつかの手順で処理しようとしていますが、いくつかの問題が発生しています。私は JCE を初めて使用するので、まだすべての最新情報を完全に把握しているわけではありません。
さまざまなエンコーディング (PEM、DER、および PCKS7) に基づいて、いくつかの異なる X509 証明書を解析できるようにしたいと考えています。FireFox を使用してhttps://belgium.beから同じ証明書をPEM および PCKS7 形式でエクスポートしました (チェーンを含む証明書)。質問に不要な数行を省略しました
public List<X509Certificate> parse(FileInputStream fis) {
/*
* Generate a X509 Certificate initialized with the data read from the inputstream.
* NOTE: Generation fails when using BufferedInputStream on PKCS7 certificates.
*/
List<X509Certificate> certificates = null;
log.debug("Parsing new certificate.");
certificates = (List<X509Certificate>) cf.generateCertificates(fis);
return certificates;
}
PCKS7 の BufferedInputStream の代わりに FileInputStream を使用している限り、このコードは正常に動作していますが、これはかなり奇妙だと思います。しかし、私はそれと一緒に暮らすことができます。
次のステップは、これらの証明書チェーンを検証することです。1) すべての証明書に有効な日付があるかどうかを確認します (簡単)。2) OCSP を使用して証明書チェーンを検証します (証明書に OCSP URL が見つからない場合は CRL にフォールバックします)。これは、これを処理する方法が完全にわからないところです。
私は Sun JCE を使用していますが、これに関するドキュメント (例) はそれほど多くないようです。
最初に、OCSP/CRL チェックを行わずにチェーンのみをチェックする単純な実装を作成しました。
private Boolean validateChain(List<X509Certificate> certificates) {
PKIXParameters params;
CertPath certPath;
CertPathValidator certPathValidator;
Boolean valid = Boolean.FALSE;
params = new PKIXParameters(keyStore);
params.setRevocationEnabled(false);
certPath = cf.generateCertPath(certificates);
certPathValidator = CertPathValidator.getInstance("PKIX");
PKIXCertPathValidatorResult result = (PKIXCertPathValidatorResult)
certPathValidator.validate(certPath, params);
if(null != result) {
valid = Boolean.TRUE;
}
return valid;
}
これは、私の PEM 証明書では正常に機能しますが、PCKS7 証明書 (同じ証明書、他の形式でのみエクスポートされます) では機能しません。 java.security.cert.CertPathValidatorException: パスがどのトラスト アンカーとも連鎖していません。
私が見ることができる唯一の違いは、CertPath が形成される順序が同じではないということですか? 何が問題なのかを理解できなかったので、今のところこれを残して PEM 証明書を使い続けましたが、これを質問 1 と呼びましょう ;)
その後に実装したかったのは、OCSP チェックです。どうやら次を使用して OCSP を有効にすると: Security.setProperty("ocsp.enable", "true"); そして、 params.setRevocationEnabled(true);を設定します。 OCSP URL を独自に見つけることができるはずですが、そうではないようです。標準実装は何をすることになっていますか (質問 2)? java.security.cert.CertPathValidatorException: OCSP レスポンダーの場所を指定する必要があります
これを過ぎて、AuthorityInfoAccessExtensionなどを使用して証明書からOCSP URLを取得する方法を見つけました。
しかし、ocsp.url プロパティで OCSP URL を手動で設定した後、java.security.cert.CertPathValidatorException: OCSP 応答エラー: UNAUTHORIZED が発生します。
多くのオンライン参照がocsp.enableプロパティを設定するだけで十分だと言っているのに、必要な手順がたくさん欠けているようです。
おそらく、プロセスを少し案内できないウィズキッドがいるでしょうか?私が完全に間違っているところを教えてください:)
次のステップは、OCSP が見つからない場合に CRL チェックを実装することです。誰かが例を指摘したり、これに関するドキュメントを見せてくれたりしたら、それも大歓迎です!
ありがとう!
編集: それ自体でプロパティを取得していないため、次を使用してすべてのプロパティを自分で設定しようとしました:
// Activate OCSP
Security.setProperty("ocsp.enable", "true");
// Activate CRLDP -- no idea what this is
Security.setProperty("com.sun.security.enableCRLDP", "true");
X509Certificate target = (X509Certificate) certPath.getCertificates().get(0);
Security.setProperty("ocsp.responderURL","http://ocsp.pki.belgium.be/");
Security.setProperty("ocsp.responderCertIssuerName", target.getIssuerX500Principal().getName());
Security.setProperty("ocsp.responderCertSubjectName", target.getSubjectX500Principal().getName());
Security.setProperty("ocsp.responderCertSerialNumber", target.getSerialNumber().toString(16));
これにより例外が発生します: java.security.cert.CertPathValidatorException: レスポンダーの証明書が見つかりません (OCSP セキュリティ プロパティを使用して設定)。