Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java apache POI为流xlsx文件创建了无效签名_Java_Excel_Apache Poi_Digital Signature_Xmlsec - Fatal编程技术网

Java apache POI为流xlsx文件创建了无效签名

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

我正在尝试创建一个有效的常规加密签名,并将其添加到我正在创建的xlsx文件中。除此之外,我还试图在记忆中做这件事。这似乎给我带来了麻烦。 此代码创建文件,但在windows excel中声明签名无效。 请注意,我正在发送一个包含xlsx(内存中-不在文件系统中)文件的输入流,并将pkg对象写入输出流

 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-