我以前在这里看到过很多类似的问题,但我还没有找到合适的答案。
我得到的签名是由C#生成和编码的。SignedCms .
我的目标是在Java中生成相同的签名。我设法创建了一个类似的签名,它的长度和大部分数据都是一样的。但有不一样的位子,从120位到133位的位置,最后大约250位。
根据这个 PKCS#7签名消息的解剖. 我有错误的签名和内容块。我试过bouncycastle,但我没能生成正确的签名。我想使用 sun.*
类来生成和编码PKCS#7消息。
X509Certificate x509 = siginingCert;
PrivateKey priv = privateKeyFromPKCS12KeyStore;
byte[] data = sha1HashOfDocument
String digestAlgorithm = "MD5";
String signingAlgorithm = "SHA1withRSA";
AlgorithmId[] digestAlgorithmIds = new AlgorithmId[]{AlgorithmId.get(digestAlgorithm)};
Signature sigSigner = Signature.getInstance(signingAlgorithm);
sigSigner.initSign(priv);
sigSigner.update(data);
byte[] signedAttributes = sigSigner.sign();
ContentInfo contentInfo = new ContentInfo(
sun.security.pkcs.ContentInfo.DATA_OID,
new DerValue(DerValue.tag_OctetString, data));
X509Certificate[] certificates = {x509};
BigInteger serial = x509.getSerialNumber();
String issuerName = x509.getIssuerDN().getName();
AlgorithmId dAlgId = AlgorithmId.getAlgorithmId(digestAlgorithm);
SignerInfo si = new SignerInfo(
new X500Name(issuerName), serial, dAlgId, null,
new AlgorithmId(AlgorithmId.RSAEncryption_oid),
signedAttributes, null);
SignerInfo[] signerInfos = {si};
PKCS7 p7 = new PKCS7(digestAlgorithmIds, contentInfo, certificates, signerInfos);
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
p7.encodeSignedData(bytes);
我在这个问题上卡住了,我不知道我错过了什么。
byte[] signedData = signature.sign();
SignerInfo si = new SignerInfo(
new X500Name(issuerName), serial, dAlgId, null,
new AlgorithmId(AlgorithmId.RSAEncryption_oid),
signedAttributes,signedData );