Java apache POI为流xlsx文件创建了无效签名
我正在尝试创建一个有效的常规加密签名,并将其添加到我正在创建的xlsx文件中。除此之外,我还试图在记忆中做这件事。这似乎给我带来了麻烦。 此代码创建文件,但在windows excel中声明签名无效。 请注意,我正在发送一个包含xlsx(内存中-不在文件系统中)文件的输入流,并将pkg对象写入输出流Java apache POI为流xlsx文件创建了无效签名,java,excel,apache-poi,digital-signature,xmlsec,Java,Excel,Apache Poi,Digital Signature,Xmlsec,我正在尝试创建一个有效的常规加密签名,并将其添加到我正在创建的xlsx文件中。除此之外,我还试图在记忆中做这件事。这似乎给我带来了麻烦。 此代码创建文件,但在windows excel中声明签名无效。 请注意,我正在发送一个包含xlsx(内存中-不在文件系统中)文件的输入流,并将pkg对象写入输出流 private ByteArrayOutputStream signFile(PrivateKey key, X509Certificate x509Certificate, InputStrea
private ByteArrayOutputStream signFile(PrivateKey key, X509Certificate x509Certificate, InputStream input) { //change to approve signed
SignatureConfig signatureConfig = new SignatureConfig();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
signatureConfig.setKey(key);
signatureConfig.setExecutionTime(new Date());
ArrayList<X509Certificate> x509Certificates = new ArrayList<>(Collections.singletonList(x509Certificate));
x509Certificates.add(x509Certificate);
signatureConfig.setSigningCertificateChain(x509Certificates);
OPCPackage pkg = null;
try {
if (input instanceof ByteArrayInputStream)
pkg = OPCPackage.open(input);
} catch (Exception ex) {
logger.error("failed to open package for file, exception:",ex);
}
signatureConfig.setOpcPackage(pkg);
// adding the signature document to the package
SignatureInfo si = new SignatureInfo();
si.setSignatureConfig(signatureConfig);
try {
si.confirmSignature();
} catch (Exception ex) {
logger.error("failed to confirm signature",ex);
}
// optionally verify the generated signature
boolean b = si.verifySignature();
if (b==false){
logger.error("signature verified result:" + b);
}
try {
pkg.flush();
pkg.save(stream);
pkg.close();
} catch (Exception ex) {
logger.error("failed to close package",ex);
}
return stream;
}
private ByteArrayOutputStream-signFile(PrivateKey-key,X509Certificate,X509Certificate,InputStream-input){//更改为批准签名
SignatureConfig SignatureConfig=新的SignatureConfig();
ByteArrayOutputStream=新建ByteArrayOutputStream();
签名配置设置键(键);
signatureConfig.setExecutionTime(新日期());
ArrayList x509Certificates=新的ArrayList(Collections.singletonList(x509Certificate));
X509证书。添加(X509证书);
签名图设置签名证书CAIN(X509证书);
OPCPackage pkg=null;
试一试{
if(ByteArrayInputStream的输入实例)
pkg=OPCPackage.open(输入);
}捕获(例外情况除外){
logger.error(“无法打开文件包,异常:”,ex);
}
signatureConfig.setOpcPackage(包装)签名;
//将签名文档添加到包中
SignatureInfo si=新的SignatureInfo();
si.设置SignatureFig(SignatureFig);
试一试{
si.confirmSignature();
}捕获(例外情况除外){
logger.错误(“未能确认签名”,ex);
}
//可选地验证生成的签名
布尔b=si.verifySignature();
如果(b==false){
错误(“签名验证结果:+b”);
}
试一试{
pkg.flush();
包装保存(流);
pkg.close();
}捕获(例外情况除外){
logger.错误(“未能关闭程序包”,ex);
}
回流;
}
此外,我还有这个测试代码,它创建了一个文件,并使用了OPCPackage.open(…),它可以工作!!excel识别签名
SignatureConfig signatureConfig = new SignatureConfig();
signatureConfig.setKey(aPrivate);
ArrayList<X509Certificate> x509Certificates = new ArrayList<>();
x509Certificates.add(x509Certificate);
signatureConfig.setSigningCertificateChain(x509Certificates);//Collections.singletonList(x509));
OPCPackage pkg = OPCPackage.open(filePath, PackageAccess.READ_WRITE);
signatureConfig.setOpcPackage(pkg);
// adding the signature document to the package
SignatureInfo si = new SignatureInfo();
si.setSignatureConfig(signatureConfig);
si.confirmSignature();
// optionally verify the generated signature
boolean b = si.verifySignature();
assertTrue(b);
// write the changes back to disc
pkg.close();
SignatureConfig SignatureConfig=new SignatureConfig();
signatureConfig.设置键(aPrivate);
ArrayList x509Certificates=新的ArrayList();
X509证书。添加(X509证书);
签名图设置签名证书CAIN(X509证书)//收藏。单音列表(x509));
OPCPackage pkg=OPCPackage.open(文件路径,PackageAccess.READ\u WRITE);
signatureConfig.setOpcPackage(包装)签名;
//将签名文档添加到包中
SignatureInfo si=新的SignatureInfo();
si.设置SignatureFig(SignatureFig);
si.confirmSignature();
//可选地验证生成的签名
布尔b=si.verifySignature();
资产净值(b);
//将更改写回光盘
pkg.close();
我的猜测是,POIXMLDocumentPart.onSave()对现有文档和新创建的文档的反应不同。我目前正忙于完成HWPF加密-如果您没有从其他人那里获得解决方案,请在POI bugzilla中打开一个bug条目,我会看一看。我打开了一个bug编号:bug 61182-我猜,POIXMLDocumentPart.onSave()对现有文档和新创建的文档的反应不同。我目前正忙于完成HWPF加密-如果您没有从其他人那里获得解决方案,请在POI bugzilla中打开一个bug条目,我会查看。我打开了一个bug编号:bug 61182-