使用SyncFusion给PDF加GlobalSign时间戳验证失败求助
PDF数字签名时间戳验证失败的解决方法(SyncFusion + GlobalSign)
问题背景
使用SyncFusion作为PDF库、GlobalSign作为CA实现PDF数字签名时,实现IPdfExternalSigner接口的Sign方法,返回的时间戳始终无法被Adobe验证,提示“签名包含嵌入的时间戳,但无法验证”,但签名主体部分(绿色勾选、LTV支持)均正常。已确认从GlobalSign获取的RFC3161时间戳令牌本身有效,尝试过传入原始DER字节或rfc3161TimestampToken.AsSignedCms().Encode()字节均无效。
核心原因
SyncFusion的IPdfExternalSigner接口要求timeStampResponse返回的是完整的RFC3161 TimeStampResponse结构,而非仅时间戳令牌(TimeStampToken)的DER字节。多数TSA服务直接返回的是TimeStampToken,但SyncFusion需要包含该令牌的完整响应结构(包含状态码、响应内容等字段)。
解决方案
将获取到的TimeStampToken包装为完整的RFC3161 TimeStampResponse后再返回,具体代码调整如下:
public byte[] Sign(byte[] message, out byte[] timeStampResponse) { var sha256MessageDigest = SHA256.HashData(message); var hexEncodedSha256MessageDigest = Convert.ToHexString(sha256MessageDigest); // 调用GlobalSign服务获取Base64编码的RFC3161时间戳令牌 var globalSignTimeStampToken = // 此处替换为调用GlobalSign的实际逻辑 var timeStampTokenBytes = Convert.FromBase64String(globalSignTimeStampToken); timeStampResponse = []; if (Rfc3161TimestampToken.TryDecode(timeStampTokenBytes, out var rfc3161TimestampToken, out _)) { // 将TimeStampToken包装为完整的TimeStampResponse结构 var pkcs9Token = new Pkcs9TimeStampToken(rfc3161TimestampToken.AsSignedCms()); var tsResponse = new TimeStampResponse( Pkcs9ObjectIdentifiers.IdTstInfo, new TimeStampResponseStatus(TimeStampResponseStatus.Granted), pkcs9Token ); // 编码为DER格式字节数组作为返回值 timeStampResponse = tsResponse.Encode(); } // 调用GlobalSign获取签名值 var hexEncodedSignatureValue = // 此处替换为调用GlobalSign获取签名的实际逻辑 return Convert.FromHexString(hexEncodedSignatureValue); }
额外检查项
- 确认GlobalSign返回的TimeStampToken包含完整的TSA证书链,Adobe需要验证TSA证书的信任路径
- 确保TimeStampResponse的编码为纯DER格式,避免多余的Base64编码或格式损坏
- 若Adobe仍无法验证,检查其信任存储是否包含GlobalSign的TSA根证书,或通过LTV将TSA证书链嵌入PDF中
内容的提问来源于stack exchange,提问作者nvoigt
相关产品推荐
相关产品推荐

