Excel数字签名技术总结

本文探讨了Excel数字签名的商业化产品对比,包括Spire.XLS、GroupDocs.Signature等,介绍了XML签名的三种类型(包围式、封装式和独立式),详细讲解了数字签名的状态以及自签名证书的生成过程,特别提到了POI在Excel签名中的应用和问题。
摘要由CSDN通过智能技术生成

Excel数字签名

Excel数字签名【商业化】产品对比

Excel数字签名产品对比
冰蓝科技GroupDocsconholdatemesciusaspose
官网冰蓝科技 e-iceblue | 您的办公文档开发技术专家 | C#/VB.Net Excel, Word, PowerPoint, PDF, Barcode 组件Document Processing APIs for .NET and Java PlatformsComprehensive File Format & Intelligent Document Processing APIsDeveloper Components for JavaScript and .NET | MESCIUS inc.File Format APIs for Word Excel PDF Email PowerPoint Barcode Images OCR Note and 3D
价格说明Spire.XLS for JAVA | 购买Pricing Information | GroupDocs.Signature for JavaPricing Information | Conholdate.Total for JavaExcel Java API Library | Generate, Load, Edit Excel Documents in Java | Document SolutionsPurchase Portal
推荐版本的价格¥39,000$3,597 $14,997 $2,799 $14,388 

上面表格中的内容是可点击的链接

签名的类型

XML的签名基本可分为三种:

包围式签名(Enveloping Signature)

封装式签名(Enveloped Signature)---  Office通常是这种

独立式签名(Detached Signatures)

1.包围式签名(Enveloping Signature)

在这种情况下,XML文档仍然保留在Signature对象内部。这意味着标签成为签名XML文档的根元素。以下是包含数字签名的结构。

<Signature >
<MyXMLDocument >
…
</MyXMLDocument >
</Signature>

该处使用的url网络请求的数据。

2.封装式签名(Enveloped Signature)---  Office通常是这种

在这种情况下,签名是被签署的XML对象的子元素。这意味着是邮件XML文档中的一个子XML标签。以下是封装数字签名的结构。

<RootElement>
<Signature>
……………………
</Signature>
</RootElement>

3.独立式签名(Detached Signatures)

在这种情况下,数字签名是独立生成的,不是XML文档的一部分。这意味着您将拥有两个XML文件,一个是要签名的XML文件,另一个是XML签名。

Excel三类数字签名状态

有效的

可恢复的

无效的

看完效果后,我们接下来再展开讲~

知识储备

1、数字签名按签署者分:万维网第三方机构签名自签名

2、按签名类型分:包围式、封装式、独立式

3、证书相关的文件有:私钥文件、公钥文件、证书请求文件、证书、密钥库

4、证书生成的工具有很多,常见的有两种:keytool、openssl

5、数字签名后的Excel按签名状态分三种:有效的、可恢复的、无效的

6、Excel数字签名只有在windows上用office软件才能查看,WPS及Mac机器都无法查看

自签名证书生成

使用keytool工具生成

示例:

keytool -genkeypair -alias 中国XX集团XX管理后端 \
-keyalg RSA -keysize 2048 -sigalg SHA256withRSA \
-storetype PKCS12 \
-dname "CN=www.chinatelecom.com.cn,OU=chinatXXXXm, \
O=CTC, L=xicheng, ST=beijing, C=china" -validity 365  \
-storepass 123456 -keystore  ctc_certificate.p12 -v

使用openssl工具生成

openssl命令示例
大类小类命令作用
证书签发生成RSA密钥openssl genrsa -out key.pem 2048 生成无密码RSA密钥
openssl genrsa -des3 -out key.pem 2048 生成有密码RSA密钥
生成一个2048位的密钥,同时有一个des3方法加密的密码
生成证书请求文件openssl req -new -key key.pem -out cert.csr 或
openssl req -sha512 -new \
-subj "/C=CN/ST=Hunan/L=Changsha/O=XXorg \
/OU=yunyuansheng/CN=k8s.dand.person" \
-key k8s.dand.person.key \
-out k8s.dand.person.csr
生成证书请求文件
证书请求文件用于向数字证书颁发机构(即CA)申请一个数字证书。CA会给你一个新的文件cert.pem,那才是你的数字证书
生成证书openssl req -new -x509 -key key.pem -out cert.pem \
-days 1095

openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Hunan/L=Changsha/O=XXXcorp \
/OU=yunyuansheng/CN=k8s.dand.person" \
-key ca.key \
-out ca.crt
(测试用)证书的申请机构和颁发机构都是自己,直接使用密钥生成证书
作者赠送查查证书信息openssl x509 -in ca.crt -text -noout
查看证书请求文件信息Openssl req -text -noout -verify -in 192.168.1.107.csr
提取ceropenssl pkcs7 -print_certs -in filename.p7b -out certfile.cer
生成pfx文件openssl pkcs12 -export -inkey newkey.pem \
-in certfile.cer -out newcert.pfx

使用POI自研

POI 做excel签名介绍

没有现成方法直接调用进行签名,需要开发相关底层一些的代码

所以问度娘看到的都是国产实现---冰蓝

当然POI也能意思一下,就像问AI,它会给你一段代码,跟POI官方给的Example差不多,大概效果下面有介绍

POI签名类

SignatureInfo (POI API Documentation)

POI官方签名效果

Apache POI - Encryption support

找:“Signing an office document”、“Validating a signed office document”

看上去是那么回事,实际签名出来的效果,不如人意(一般会是无效的),想生成有效的、或是可恢复的签名需要下一翻苦工(当然老铁们如果弄出来了也可卖个好价钱,毕竟商业化的价格摆上面了)

作者提示【赠送】

  1. Learn-》Microsoft 365--》疑难解答

打开在早期版本中进行数字签名的 Excel 工作簿时出现“此文档包含无效签名”错误【Microsoft官方】

如果在较新版本的 Excel 文件中打开数字签名,则文档包含无效签名错误 - Microsoft 365 Apps | Microsoft Learn

通过官方的这个疑难解答基本可以猜测POI官方做的签名默认以低版本的office规范实现(毕竟签名时没有要求指定office excel的版本,而冰蓝官方却有)

冰蓝科技(ice-blue)代码demo:

package person.daizhongde.devops.spire;

import com.spire.xls.ExcelVersion;
import com.spire.xls.Workbook;
import com.spire.xls.digital.CertificateAndPrivateKey;

import java.util.Date;

public class AddDigitalSignature {
    public static void main(String []args) throws Exception {
        //创建一个 Workbook 实例
        Workbook workbook=new Workbook();
        //加载 Excel 文件
        workbook.loadFromFile("D:\\java项目\\docStory转xlsUS\\测试模板\\签名测试\\2.xlsx");

        String srcPath = "D:\\java项目\\docStory转xlsUS\\测试模板\\openssl生成证书\\client.pkcs12";;
//        String srcPath2 = "D:\\java项目\\docStory转xlsUS\\测试模板\\签名测试\\ctc_certificate.p12";
//        String srcPathOK="D:\\java项目\\docStory转xlsUS\\测试模板\\签名测试\\certificate.p12";
        //向文件添加数字签名
        CertificateAndPrivateKey cap = new CertificateAndPrivateKey(
                srcPath,
                "12345678");
        //  中国电XX集团5G管理后端   testalias
        workbook.addDigitalSignature(cap, "中国电XX",new Date());

        //保存结果文件
        workbook.saveToFile("D:\\java项目\\docStory转xlsUS\\测试模板\\签名测试\\添加数字签名.xlsx", ExcelVersion.Version2016);
    }
}

  • 20
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞火流星02027

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值