生成的数字签名DER格式错误

Java调用CMSSignedDataGenerator生成的数字签名DER格式错误,以下3个地方均出错(长度字节不应该为80):

img

Java代码为:

 try {
            //获取私钥
            FileReader keyReader = new FileReader(keyPath);
            PEMParser pemParser = new PEMParser(keyReader);
            JcaPEMKeyConverter converter = new JcaPEMKeyConverter();
            PrivateKeyInfo privateKeyInfo = PrivateKeyInfo.getInstance(pemParser.readObject());
            PrivateKey prikey = converter.getPrivateKey(privateKeyInfo);

            //获取证书
            CertificateFactory certificatefactory = CertificateFactory.getInstance("X.509", "BC");
            InputStream bais = new FileInputStream(certPath);
            X509Certificate cerx509 = (X509Certificate) certificatefactory.generateCertificate(bais);

            //添加Certificates
            CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
            List certList = new ArrayList();
            certList.add(cerx509);
            Store certs = new JcaCertStore(certList);
            gen.addCertificates(certs);

            //添加SignerInfo
            ContentSigner sha1Signer = new JcaContentSignerBuilder("SM3withSM2").setProvider("BC").build(prikey);
            gen.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().setProvider("BC").build()).build(sha1Signer, cerx509));

            //生成SignedData
            CMSTypedData msg = (CMSTypedData) new CMSProcessableByteArray(srcMsg.getBytes(charSet));
            CMSSignedData sigData = gen.generate(msg, true);

            return sigData.getEncoded();


        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    由于没有具体的代码和错误信息,我将给出一般性的解决方案:

    1. 确认生成数字签名的算法和密钥是否正确。可以尝试使用其他算法或密钥进行生成,看是否能够得到正确的DER格式。

    2. 确认生成数字签名的消息的编码格式是否正确,比如UTF-8或者ISO-8859-1等。可以尝试修改消息的编码格式来查看是否能够得到正确的DER格式。

    3. 确认生成数字签名时使用的证书是否正确。可以检查证书的有效期、颁发机构等信息,或者尝试使用其他证书来生成数字签名。

    4. 确认生成数字签名时使用的数据是否正确。可以检查数据的完整性、格式等信息,或者尝试使用其他数据来生成数字签名。

    5. 可以使用Java提供的DER编解码工具来检查生成的DER格式是否正确。具体的代码可以参考下面的示例:

    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    
    import sun.security.util.DerInputStream;
    import sun.security.util.DerValue;
    
    public class DerDecoder {
    
        public static void main(String[] args) throws IOException {
    
            // 读取DER格式的数据
            byte[] derBytes = Files.readAllBytes(Paths.get("path/to/der/file"));
    
            // 解码DER格式的数据
            DerInputStream derInputStream = new DerInputStream(derBytes);
            DerValue derValue = derInputStream.getDerValue();
    
            // 打印解码后的数据
            System.out.println(derValue);
        }
    }
    

    希望这些信息能够帮助到你,如果你有具体的问题或者提供具体的代码和错误信息,可以重新提出问题,以便得到更准确的回答。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^