有没有办法获取由pkcs11Interop创建的签名中的签名创建日期?

时间:2019-07-08 02:37:02

标签: pkcs#11 pkcs11interop

我使用 X509Chain.Build(X509Certificate2)方法验证证书。如果证书有效,则使用 Pkcs11Interop 库对数据签名。任何有兴趣的用户都可以下载此签名以自行验证。但是他们也应该能够检查证书的有效性。

我现在正在编写一些测试工具,该工具将获取所有这些文件并检查有效性。但是为了验证证书,我需要签名创建日期。 是否可以通过签名获得该日期?

现在我将签名创建日期存储在表的单独字段中。但我确实认为签名包含创建日期。至少我希望如此。

我正在验证证书,如果可以,我使用下一个代码对一些数据进行签名。

var privateKeys = session.FindAllObjects(SignSettings.PrivateKeyAttributes);

var mechanism = session.Factories.MechanismFactory.Create(CKM.CKM_GOSTR3411);

byte[] hash = session.Digest(mechanism, data);

var signMechanism = session.Factories.MechanismFactory.Create(CKM.CKM_GOSTR3410);

var signature = session.Sign(signMechanism, privateKeys[0], hash);

return signature;

然后我将此签名和签名数据存储在数据库中

在我的测试签名检查器应用程序中,我使用X509Chain检查证书是否有效。

var chain = X509Chain.Create();
var policy = chain.ChainPolicy;
policy.RevocationMode = X509RevocationMode.Offline;
policy.RevocationFlag = X509RevocationFlag.EndCertificateOnly;
policy.VerificationTime = @signatureDate;
policy.UrlRetrievalTimeout = UrlRetrievalTimeout;

chain.Build(cert);
return chain;

1 个答案:

答案 0 :(得分:1)

使用常规PKCS#11调用,您将获得无任何附加属性的纯签名。

要将签名日期嵌入签名,必须使用PKCS#7消息传递功能。

据我记得您以前的question,您使用的是ruToken。
看看他们自己在{.3中使用PKCS#11扩展名的samples

byte[] signature = session.PKCS7Sign(SampleData.PKCS7_SignDataBytes,
    certificates[0], privateKeys[0], null, SampleConstants.UseHardwareHash);

然后,您可以使用EnvelopedCmsSignedCms获取签名属性SignerInfo.SignedAttributes,其中之一就是签名时间。