能否在 Excel VBA 项目中签署时间戳?

5
我使用X509Certificate2和EPPlus自动为Excel文件中的VBA代码签名,这很有效。现在我想添加时间戳,您知道在哪里设置吗?
如果我在VBA编辑器-工具-数字签名中手动签署代码,则代码将被签署,并带有时间戳(和计数签名)。因此,即使签署人的证书已过期,代码仍然有效。但是,使用EPPlus进行签名时却没有时间戳。在ExcelVBASignature.cs中,该功能似乎已经准备好了...
以下是目前我的做法:
using System;
using System.IO;
using OfficeOpenXml;
using System.Security.Cryptography.X509Certificates;
...
X509Certificate2 cert = new X509Certificate2 ( PFXfile, PFXpass, X509KeyStorageFlags.PersistKeySet );
using ( ExcelPackage xl = new ExcelPackage ( new System.IO.FileInfo ( Excelfile ) ) )
{
    using ( ExcelWorkbook wb = xl.Workbook )
    {
        wb.VbaProject.Signature.Certificate = cert;
        xl.SaveAs ( new System.IO.FileInfo ( TargetPath ) );
    }
}

1
Certificate.HasPrivateKey 是 true 吗?如果不是,似乎它将无法工作。 - Ernie S
1
是的,有的。我使用“使私钥可导出”选项从我的CA请求了证书。 - Rigazoni
1个回答

14

我可以使用Microsoft SignTool来解决我的请求,而不是EPPlus:

我使用Microsoft SignTool(来自Microsoft Windows 10 SDK),以Microsoft Office Subject Interface Packages for Digitally Signing VBA Projects

详细信息:

  1. 下载并安装SDK
    包含signtool.exe的文件夹为例如:C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x86
    确保使用x86文件夹。
  2. 下载和提取SIP Package
    阅读并遵循所包含的readme.txt文件
  3. 选择您偏好的signtool.exe的参数和选项

示例:使用以下命令,Excel文件中的VBA代码将使用包含私钥的证书文件进行计数签名。 Excel工作簿本身将不会被签名。

signtool.exe sign /f "CertificateFile.pfx" /p "P@ssw0rd" /fd "SHA256" /tr "http://rfc3161timestamp.globalsign.com/advanced" /td "SHA256" "D:\ExcelFileWithVBA.xlsm"

1
另外一点需要注意的是:如果您不想让证书密码成为命令的一部分,您可以选择(1)在PowerShell中使用Get-PfxCertificate my.pfx确定其指纹(2)将证书导入本地证书存储区,然后(3)用/ sha1 <thumbprint>替换/f和/p参数。 - Michael Schmeißer
1
这对我不起作用。 SignTool.exe可以用于Office文件吗? 错误是“尝试签名时出错:D:\ ExcelFileWithVBA.xlsm。无法对此文件格式进行签名,因为它未被识别。” - SF Lee
1
我今天按照这些说明操作,@SFLee,它对我有效。你可能没有按照自述文件注册dll,或者没有使用x86 signtool。 - dten
@SFLee 请确保您以管理员权限运行 regsvr32.exe msosipx.dll - Frank Myat Thu
我使用VBA签名工具已经有很多年了。然而,我的带有时间戳的证书刚刚过期,导致客户抱怨软件无法正常运行。这是Excel中的一个新的VBA错误吗? - Tuntable

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接