13

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 セキュリティ プロパティを使用して設定)。

4

1 に答える 1

18

今後の参考のために、私は自分の質問への回答を投稿します(少なくとも部分的に)

OCSP および CRL チェックは標準の Java 実装に既に実装されており、カスタム コードやその他のプロバイダー (BC など) は必要ありません。デフォルトでは無効になっています。

これを有効にするには、少なくとも 2 つのパラメーターを設定する必要があります。

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

これにより、証明書パス (PKIXCertPathValidatorResult.validate()) を検証しようとしているときに、OCSP チェックがアクティブになります。

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

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

さまざまな証明書形式 (PKCS7、PEM) をサポートする必要があるため、多くの問題が発生しています。私の実装は PEM で問題なく動作しますが、PKCS7 はチェーン内の証明書の順序を保存しないため、少し難しくなります ( http://bugs.sun.com/view_bug.do?bug_id=6238093 )

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);   

これが他の人にとっても有益な発言になることを願っています。おそらく誰かが、順序付けられていない PKCS7 リストでターゲット証明書を見つける方法に光を当てることができますか?

于 2012-04-09T01:29:25.977 に答える