本文介绍了Bouncycastle以ASCII/二进制格式写入cms MIME头的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用bouncycastle c#生成cms签名的数据文件,而我的openSsl命令在下面

  openssl cms -sign -in data.txt -binary -signer selfsigned.crt -inkey keypair.pem -out data.signed -keyopt rsa_padding_mode:pss 

输出文件格式openssl

  MIME版本:1.0内容类型:多部分/已签名;protocol ="application/pkcs7-signature";micalg ="sha-256";boundary ="---- DE5BACF44AD3EE95D349BA916BEEB444"这是S/MIME签名的消息------ DE5BACF44AD3EE95D349BA916BEEB444数据在这里------ DE5BACF44AD3EE95D349BA916BEEB444内容类型:application/pkcs7签名;名称="smime.p7s";内容传输编码:base64内容处置:附件;filename ="smime.p7s";一些BASE 64数据------ DE5BACF44AD3EE95D349BA916BEEB444--============================================== 

BouncyCastle的输出不一样,即以ascii格式编写的标题,类似

  0€*†H†÷€0€10`†他0€*†H†÷€$€,数据在这里€0€10`†他0€*†H†÷€$€,€0€10`†他0€*†H†÷€$€,€0€10`†他0€*†H†÷€$€,€0€10`†他0€*†H†÷€$€, 

如何获得与openssl相同的标题

cms符号的BouncyCastle代码

 无效符号(字节[]数据,字节[] signCert,字节[]私钥){X509CertificateParser解析器=新的X509CertificateParser();X509Certificate证书=解析器.ReadCertificate(signCert);var reader = new StreamReader(new MemoryStream(privateKey),Encoding.Default);AsymmetricCipherKeyPair keyPair =(AsymmetricCipherKeyPair)new PemReader(reader).ReadObject();CmsSignedDataGenerator生成器=新的CmsSignedDataGenerator();generator.AddSigner(keyPair.Private,证书,CmsSignedGenerator.EncryptionRsaPss,CmsSignedGenerator.DigestSha256);列表< X509Certificate>certList = new List< X509Certificate>();certList.Add(certificate);CmsSignedDatasignedData = generator.Generate(CmsSignedGenerator.Data,新CmsProcessableByteArray(data),true);File.WriteAllBytes(@"c:\ data.txt.signed",signedData.GetEncoded());} 

有什么想法吗?

解决方案

BouncyCastle不会生成这些标头.您需要自己执行此操作,或者使用像 MimeKit 这样的库来为您完成.>

I using bouncycastle c# to generate cms signed data file and my openSsl command is below

openssl cms -sign -in data.txt -binary -signer selfsigned.crt -inkey keypair.pem -out data.signed -keyopt rsa_padding_mode:pss

The output file form openssl

MIME-Version: 1.0
Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg="sha-256"; boundary="----DE5BACF44AD3EE95D349BA916BEEB444"

This is an S/MIME signed message

------DE5BACF44AD3EE95D349BA916BEEB444
Data HERE
------DE5BACF44AD3EE95D349BA916BEEB444
Content-Type: application/pkcs7-signature; name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"

SOME BASE 64 DATA
------DE5BACF44AD3EE95D349BA916BEEB444--

===============================================

BouncyCastle output is not that same, i.e the header written in ascii format, something like that

0€  *†H†÷
 €0€10
    `†He 0€ *†H†÷
 €$€‚

Data HERE

 €0€10
    `†He 0€ *†H†÷
 €$€‚ €0€10
    `†He 0€ *†H†÷
 €$€‚ €0€10
    `†He 0€ *†H†÷
 €$€‚ €0€10
    `†He 0€ *†H†÷
 €$€‚

How to get the same header like the openssl

BouncyCastle code for cms sign

void Sign(byte[] data, byte[] signCert, byte[] privateKey){
            X509CertificateParser parser = new X509CertificateParser();
            X509Certificate certificate = parser.ReadCertificate(signCert);
            var reader = new StreamReader(new MemoryStream(privateKey), Encoding.Default);
            AsymmetricCipherKeyPair keyPair = (AsymmetricCipherKeyPair)new PemReader(reader).ReadObject();
            CmsSignedDataGenerator generator = new CmsSignedDataGenerator();
            generator.AddSigner(keyPair.Private, certificate, CmsSignedGenerator.EncryptionRsaPss,
            CmsSignedGenerator.DigestSha256);
            List<X509Certificate> certList = new List<X509Certificate>();
            certList.Add(certificate);
            CmsSignedData signedData = generator.Generate(CmsSignedGenerator.Data, new
            CmsProcessableByteArray(data), true);
            File.WriteAllBytes(@"c:\data.txt.signed", signedData.GetEncoded());
    }

Any ideas?

解决方案

BouncyCastle won't produce those headers. You would need to do that yourself or use a library like MimeKit that will do it for you.

这篇关于Bouncycastle以ASCII/二进制格式写入cms MIME头的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-27 21:27