由于数字签名格式 XML 和 PKCS#7 的性质,不可能从一种转换为另一种。
在一个非常简化的解释中, PKCS#7格式的签名除其他内容外,还包含一些称为 DigestInfo 的特定数据结构,其中包含数据摘要和 OID(对象标识符),并已使用用户的私钥加密。XML-Dsig格式将加密算法的最后一步(同样使用用户的私钥)应用于通过消化原始 XML 数据和某些特定 XML-DSig 数据结构计算得出的不同数据值。因此,由于两个加密值将不相同,因此只能通过使用您无权访问的用户私钥对数据进行签名来生成 XML-DSig 签名(因此名称为 private)。
从那个解释来看,你的第一个问题的答案是“不,没有平滑的选择,根本不可能”。
因此,唯一的选择是直接在客户端生成 XML-DSig。使用标准 Javascript 是不可能的,绝对不能使用 Firefox 的 window.crypto(它只生成 PKCS7 分离签名)。在我的公司 ( www.isigma.es ),我们通过使用小程序来解决这个问题,它是数字签名行业的常见解决方案(有许多商业解决方案和一些开源解决方案)。如果您不想要浏览器插件,这可能不是您的选择。
CAPICOM(您可以在 Microsoft 设置中使用的基于 Windows 的 Active/X 组件)也不会生成 XML-DSig,只会生成 CMS/PKCS7。