5

X509CertificateObject と一致する RSAPublicKey があり、一部のメッセージ オブジェクトの有効なデジタル証明書をバイト配列として含むバイト配列を作成することができました。

残念ながら、私が構築しているシステムはCMSSignedDataオブジェクトのみを入力として受け入れます。CMSSignedData基本的な構成要素をそのような有効なオブジェクトに変換するにはどうすればよいですか?

背景:この例(ダイジェストは SHA512)に従って Java Bouncy Castle RSA ブラインド署名を試しており、結果を標準の署名処理にフィードする必要があります。

4

1 に答える 1

0

まず、おそらく秘密鍵でデータに署名したいと思うでしょう。署名は自分だけが作成できるものでなければならないという考えです。残りは次のようになります。


X509Certificate signingCertificate = getSigningCertificate();
//The chain of certificates that issued your signing certificate and so on
Collection<X509Certificate> certificateChain = getCertificateChain();
PrivateKey pk = getPrivateKey();
byte[] message = "SomeMessage".getBytes();

CMSSignedDataGenerator generator = new CMSSignedDataGenerator();
certificateChain.add(signingCertificate);
generator.addCertificates(new CollectionStore(certificateChain));

JcaDigestCalculatorProviderBuilder jcaDigestProvider = new JcaDigestCalculatorProviderBuilder();
jcaDigestProvider.setProvider(new BouncyCastleProvider());
JcaSignerInfoGeneratorBuilder singerInfoGenerator = new JcaSignerInfoGeneratorBuilder(jcaDigestProvider.build());

AlgorithmIdentifier sigAlgId = new DefaultSignatureAlgorithmIdentifierFinder().find("SHA1withRSA");
AlgorithmIdentifier digAlgId = new DefaultDigestAlgorithmIdentifierFinder().find(sigAlgId);
AsymmetricKeyParameter privateKeyParam = PrivateKeyFactory.createKey(pk.getEncoded());
ContentSigner cs = new BcRSAContentSignerBuilder(sigAlgId, digAlgId).build(privateKeyParam);

SignerInfoGenerator sig = singerInfoGenerator.build(cs, signingCertificate);
generator.addSignerInfoGenerator(sig);

CMSSignedData data = generator.generate(new CMSProcessableByteArray(message), true);
于 2013-02-22T23:05:59.830 に答える