我正在努力解决以下问题:
使用mozilla的window.crypto.signText在客户端创建XML消息并进行数字签名。签名后,消息和签名通过Web服务(.net)传输到服务器。到目前为止,一切都很好。
在服务器上,XML应包含在另一个可公开访问的XML文档中。签名也应该发布,以便授予不可否认性。
问:是否有一个平滑的选项可以将分离的Pkcs#7转换为XML-DSIG(例如.net框架内的功能)?
Q2:或者是否可以在不使用外部插件的情况下创建XML-DSIG客户端?
Tnx的帮助!
Alois Paulin
答案 0 :(得分:4)
由于数字签名格式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),我们通过使用applet来解决这个问题,它是数字签名行业的常见解决方案(有许多商业解决方案和一些开源解决方案)。如果你不想要浏览器插件,这可能不是你的选择。
CAPICOM(您可以在Microsoft设置中使用的基于Windows的活动/ X组件)也不会生成XML-DSig,只生成CMS / PKCS7。