私はいくつかの手順でX509証明書を処理しようとしており、いくつかの問題が発生しています。私はJCEを初めて使っているので、まだすべてのことについて完全に最新ではありません。Java X509証明書の解析と検証
異なるエンコーディング(PEM、DER、PCKS7)に基づいて、いくつかの異なるX509証明書を解析できるようにします。 FireFox(チェーンを含む証明書)を使用して、PEMおよびPCKS7形式のhttps://belgium.beから同じ証明書をエクスポートしました。私はFileInputStreamを代わりに、すでに私が考えるかなり奇妙ですPCKS7ためBufferedInputStreamを、で動作するようaslong正常に動作している質問
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;
}
このコードのために必要されていないうち数行を残してきましたか?しかし、私はそれで生きることができます。
次の手順は、これらの証明書チェーンを検証することです。 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証明書を(同じcertifcate、唯一の他の形式でエクスポート)されていません。 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応答のエラーを必要なステップがたくさんありますが、多くのオンラインリファレンスでは、ocsp.enableプロパティを設定するだけで十分でしょうか?
おそらくあなたのうちの誰かが、プロセスを通して私を少しガイドできないでしょうか?私が完全に間違っているところを教えてください:)
次のステップでは、OCSPが見つからなかった場合、誰かが例を指摘したり、私にこれについてのいくつかの文書を表示したりすることができれば、それは非常に高く評価されます。
ありがとうございます!
EDIT:
// 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セキュリティプロパティを使用して設定されます)。今後の参考のために
OSCPCheckerはgetOCSPServerURIメソッドでこれを行うようです:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/sun/security/provider/certpath/OCSPChecker .java#OCSPChecker.getOCSPServerURI%28sun.security.x509.X509CertImpl%2Cjava.lang.String%29 –
あなたの例では 'cf'とは何ですか? – spy
これは長続きしていますが、https://docs.oracle.com/javase/7/docs/api/java/security/cert/CertificateFactory.html –