2012-04-06 42 views
12

私はいくつかの手順で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セキュリティプロパティを使用して設定されます)。今後の参考のために

+0

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 –

+0

あなたの例では 'cf'とは何ですか? – spy

+0

これは長続きしていますが、https://docs.oracle.com/javase/7/docs/api/java/security/cert/CertificateFactory.html –

答えて

15

私は

OCSPとCRLチェックはすでに標準のJava実装で実装されている(一部は少なくとも)自分の質問への答えを投稿しますし、カスタムコードまたは他のプロバイダ(BCのための必要はありません、..)。デフォルトでは無効になっています。証明書パス(PKIXCertPathValidatorResult.validateを())を検証しようとしているときには、OCSPチェックが有効になります

(PKIXParameters or PKIXParameterBuilder) params.setRevocationEnabled(true); 
Security.setProperty("ocsp.enable", "true"); 

:これを有効にするに

、あなたは少なくともに持っている2つのパラメータを設定します。

あなたは何OCSPが利用できない場合、CRLのフォールバックチェックを追加したい、aditionalプロパティを追加します。

System.setProperty("com.sun.security.enableCRLDP", "true"); 

私の問題の多くは、私は別の証明書をサポートする必要があるという事実による起こっていますフォーマット(PKCS7、PEM)。これは、誰かができ、おそらく、同様に他の人々のために有用な発言ことを願っ

X509CertSelector targetConstraints = new X509CertSelector(); 

targetConstraints.setCertificate(certificates.get(0)); 
// Here's the issue for PKCS7 certificates since they are not ordered, 
// but I havent figured out how I can see what the target certificate 
// (lowest level) is in the incoming certificates.. 

PKIXBuilderParameters params = new PKIXBuilderParameters(anchors, targetConstraints); 

私の実装では、PEMのために正常に動作しますが、PKCS7は、チェーン内の証明書の順序を保存しませんので、それは(http://bugs.sun.com/view_bug.do?bug_id=6238093)ビット難しいです順序付けられていないPKCS7リストでターゲット証明書を見つける方法について説明していますか?

関連する問題