1

CSR、自己署名証明書などを作成(および署名)するためのいくつかのヘルパーメソッドを作成しようとしています...私はすでにいくつかのメソッドを廃止された機能で実装していました。最新の状態に追いつくために、私はbouncycastleを1.47にアップグレードしました。これは大きく異なるようで、2つのことを考えていました。

1)例の簡潔なリストを追跡できないようです。以前と同様のことを実行するために必要なコードの冗長性が追加されたため、これは非常に歓迎されます。

2)古典的なJCEのものを混ぜながら、弾力のある城で作業するのは不当に難しいようです。少なくとも以前よりもはるかに困難です。これには理由がありますか?

後者の例として、csrの生成を取り上げます。これは、これを行うのと同じくらい簡単でした。

org.bouncycastle.jce.PKCS10CertificationRequest request = new org.bouncycastle.jce.PKCS10CertificationRequest(type.toString(), subject, pair.getPublic(), null, pair.getPrivate());

件名が「javax.security.auth.x500.X500Principal」である場合、秘密鍵と公開鍵は一般的な「java.security.KeyPair」などに由来します。

今私は次のようなものを持っています:

public byte[] generatePKCS10(KeyPair pair, SignatureType type, X500Principal subject) throws IOException {
    PKCS10CertificationRequestBuilder builder = new PKCS10CertificationRequestBuilder(
        new X500Name(subject.getName()),
        SubjectPublicKeyInfo.getInstance(pair.getPublic())
    );
    AlgorithmIdentifier sigAlgId = new DefaultSignatureAlgorithmIdentifierFinder().find(type.toString());
    AlgorithmIdentifier digAlgId = new DefaultDigestAlgorithmIdentifierFinder().find(sigAlgId);
    AsymmetricKeyParameter keyParam = PrivateKeyFactory.createKey(pair.getPrivate().getEncoded());
    try {
        ContentSigner signer = new BcRSAContentSignerBuilder(sigAlgId, digAlgId).build(keyParam);
        PKCS10CertificationRequest csr = builder.build(signer);
        ContentVerifierProvider verifier = new JcaContentVerifierProviderBuilder().setProvider(new BouncyCastleProvider()).build(pair.getPublic());
        csr.isSignatureValid(verifier);
        return csr.getEncoded();
    }
    catch (OperatorCreationException e) {
        throw new IOException(e);
    }
    catch (PKCSException e) {
        throw new IOException(e);
    }
}

私が見逃している簡単な変換ユーティリティやオーバーロードされたメソッド、またはJCE固有の実装がたくさんありますか?多くのグーグル検索が物事を行う古い(読む:非推奨)方法を強調することは助けにはなりません。

4

1 に答える 1

1

これを投稿した直後に、JCE準拠のソリューションに出くわしました。それらのクラスのかなりの数が、必要なすべての変換を処理するJCA固有の拡張機能を持っているようです。たとえば、「X509v1CertificateBuilder」は、「new JcaX509v1CertificateBuilder()」としてインスタンス化できます。これは、弾む城固有のパラメーターの代わりにJCEパラメーターを取ります。

上記の例の場合:

PKCS10CertificationRequestBuilder builder = new JcaPKCS10CertificationRequestBuilder(
    subject,
    pair.getPublic()
);

このパターンが成り立つことを願っています...

于 2012-07-13T12:38:58.707 に答える