在iText 8(C#)中读取TimeStampToken遇ASN1结构转换问题求助
解决iText 8(C#)中TimeStampToken转ContentInfo的类型转换异常问题
你的问题出在重复序列化/反序列化ASN1结构以及可能的OID误用,导致ContentInfo构造时类型不匹配。以下是修正方案:
问题根源
- 无需将
TimeStampTokenInfo的ASN1结构先转成字节数组再重新解析,这一步完全多余,还会引入类型匹配风险。 ContentInfo构造函数接受Asn1Encodable类型参数,而TimeStampTokenInfo.ToASN1Primitive()直接返回符合要求的Asn1Primitive(继承自Asn1Encodable),可直接使用。- 若要封装
TimeStampTokenInfo本身,应使用对应OID(PkcsObjectIdentifiers.IdCtTstInfo),而非IdAAEtsContentTimestamp(后者用于Ets内容时间戳属性场景)。
修正后的代码
// 获取TimeStampTokenInfo TimeStampTokenInfo tstInfo = pkcs7.GetTimeStampTokenInfo(); // 直接获取其ASN1原始结构,无需额外序列化/反序列化 Asn1Primitive tstAsn1 = tstInfo.ToASN1Primitive(); // 创建ContentInfo,根据场景选择正确OID // 场景1:封装TimeStampTokenInfo本身 ContentInfo contentInfo = new ContentInfo(PkcsObjectIdentifiers.IdCtTstInfo, tstAsn1); // 若场景为Ets内容时间戳属性,保留原OID: // ContentInfo contentInfo = new ContentInfo(PkcsObjectIdentifiers.IdAAEtsContentTimestamp, tstAsn1);
原代码异常原因
原代码中Asn1Object.FromByteArray()解析后的对象类型,与ContentInfo构造函数期望的ASN1结构类型不匹配,加上重复序列化反序列化过程可能破坏原始结构的类型信息,最终触发强制转换异常。直接使用ToASN1Primitive()返回的对象可避免该问题。
内容的提问来源于stack exchange,提问作者robob
相关产品推荐
相关产品推荐

