【问题标题】:Create a PKCS#7 signed message in c# with a precomputed signature在 c# 中使用预先计算的签名创建一个 PKCS#7 签名的消息
【发布时间】:2017-01-21 12:59:56
【问题描述】:

我正在尝试在 C# 中创建 PKCS#7 签名消息。数字签名是在 HSM 中单独计算的,所以我已经有了签名的值,我只想创建一个包含它的 PKCS#7 结构。

我研究过在 System.Security.Cryptography.Pkcs 命名空间中使用 SignedCms,但这似乎没有提供预先计算签名的选项。

当我已经拥有数字签名的值时,在 C# 中生成 PKCS#7 结构的最佳方法是什么?

【问题讨论】:

    标签: c# cryptography digital-signature pkcs#7 hsm


    【解决方案1】:

    AFAIK 你不能用“内置”.NET 类做到这一点。

    但是,我创建了一个示例应用程序 - Pkcs7SignatureGenerator - 用于使用 Pkcs11Interop(我是其作者)和 Bouncy Castle 库创建 CMS 签名。

    在此应用程序中,Pkcs11Interop 库通过 PKCS#11 API 使用存储在硬件设备中的私钥执行签名操作,BouncyCastle 库负责构建 CMS (PKCS#7) 签名结构。

    【讨论】:

    • 这很有帮助,谢谢。我最终使用您的 Pkcs7SignatureGenerator 项目中的代码作为起点,并稍微调整它以适应我的需要。
    【解决方案2】:

    我想你想要的是X509Certificate2类,使用静态CreateFromSignedFile函数从签名文件中检索证书,或者使用CreateFromCertFile从指定的证书文件中创建:

    X509Certificate2 cert = X509Certificate2.CreateFromSignedFile(filename);
    CmsSigner signer = new CmsSigner(cert);
    

    【讨论】:

    • 这种方法的问题是,当证书上没有私钥时,CmsSigner 将尝试使用证书上的私钥计算签名,私钥仅存在于 HSM 中。我本质上想要一个 SignedCms 类的版本,我可以为它提供数字签名,而不是让 CmsSigner 计算一个。
    • @AndyGibson 您能否在您的 OP 中提供一个简化示例来说明您所拥有的以及您想要实现的目标?还包括任何可能相关的示例代码,即使它可能是伪代码,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    相关资源
    最近更新 更多