Excel数字签名
Excel数字签名【商业化】产品对比
上面表格中的内容是可点击的链接
签名的类型
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 | ||
提取cer | openssl 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”
看上去是那么回事,实际签名出来的效果,不如人意(一般会是无效的),想生成有效的、或是可恢复的签名需要下一翻苦工(当然老铁们如果弄出来了也可卖个好价钱,毕竟商业化的价格摆上面了)
作者提示【赠送】
- 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);
}
}
作者建议
如果是用POI自研需要对POI及Office结构内容进行较深入的研究。但我相信只要信念坚定一定会有能成功的读者。加油~