Java调用CMSSignedDataGenerator生成的数字签名DER格式错误,以下3个地方均出错(长度字节不应该为80):
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;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:由于没有具体的代码和错误信息,我将给出一般性的解决方案:
确认生成数字签名的算法和密钥是否正确。可以尝试使用其他算法或密钥进行生成,看是否能够得到正确的DER格式。
确认生成数字签名的消息的编码格式是否正确,比如UTF-8或者ISO-8859-1等。可以尝试修改消息的编码格式来查看是否能够得到正确的DER格式。
确认生成数字签名时使用的证书是否正确。可以检查证书的有效期、颁发机构等信息,或者尝试使用其他证书来生成数字签名。
确认生成数字签名时使用的数据是否正确。可以检查数据的完整性、格式等信息,或者尝试使用其他数据来生成数字签名。
可以使用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);
}
}
希望这些信息能够帮助到你,如果你有具体的问题或者提供具体的代码和错误信息,可以重新提出问题,以便得到更准确的回答。