2012-11-22 3 views
5

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

残念ながら私が構築しているシステムは入力としてCMSSignedDataオブジェクトを受け入れます。 基本ビルディングブロックを有効なCMSSignedDataオブジェクトに変換するにはどうすればよいですか?

背景:this example(ダイジェストはSHA512)に従ってJava Bouncy Castle RSAの盲目の署名を実験しており、その結果を標準的な署名処理に送る必要があります。

答えて

0

まず、秘密鍵でデータに署名する必要があります。署名はあなただけが作成できるものでなければならないという考えがあります。残りの部分は次のようになるはずです:


X509Certificate signingCertificate = getSigningCertificate(); 
//The chain of certificates that issued your signing certificate and so on 
Collection&ltX509Certificate> 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); 
関連する問題