使用OpenSSL验证XML文件签名

使用OpenSSL验证XML文件签名,openssl,cryptography,certificate,digital-signature,public-key-encryption,Openssl,Cryptography,Certificate,Digital Signature,Public Key Encryption,我有一个签名的XML文档和用于签名的证书的公钥。我只想使用CLI中的OpenSSL验证XML文件的签名。我试过命令: openssl rsautl -verify -in signed.xml -inkey public_key.pem -pubin 但它会输出错误: RSA operation error 139662304335680:error:0406706C:rsa routines:rsa_ossl_public_decrypt:data greater than mod len:

我有一个签名的XML文档和用于签名的证书的公钥。我只想使用CLI中的OpenSSL验证XML文件的签名。我试过命令:

openssl rsautl -verify -in signed.xml -inkey public_key.pem -pubin
但它会输出错误:

RSA operation error
139662304335680:error:0406706C:rsa routines:rsa_ossl_public_decrypt:data greater than mod len:crypto/rsa/rsa_ossl.c:609:
该错误可能与rsautl的问题有关,因为手册告诉我们它只能处理小数据。 我试过的另一个命令:

openssl dgst -verify public_key.pem -signature signed.xml to_sign.xml

但这一个需要另外一个文件(假定为二进制文件)作为参数,这可能是用于分离的签名(我的签名是封装的)。签名通过其他方式进行检查且有效。我可以知道我的命令中的错误是什么吗?我是否可以通过
openssl
来做到这一点。谢谢大家!

XML digsig实际上是一个完整的协议,它定义了一个容器格式,以及生成该容器格式并验证其正确性的正确方法(尽管它在这方面严重不足,因为它自己创建了一个验证应用程序)

因此XMLDigsig在内部使用RSA算法/验证。但是,这与签名/验证文件不同。RSA可以在内部使用,但只对XML的特定部分进行签名,添加有关签名的附加信息,并且签名肯定不会放在XML文件的末尾,因为结果显然不再是有效的XML(因为它应该通过关闭第一个/最上面的标记来结束)

因此,不能使用
openssl
命令行来验证使用此协议的签名XML文件,因为它没有实现。您可以使用
openssl
作为工具来实现它(尽管使用opensslapi会更有意义),但是您最好寻找一个替代库来实现它。该库可以使用OpenSSL或任何其他底层加密库作为底层算法。

似乎使用OpenSSL。不幸的是,这不是唯一的依赖关系,我没有使用它,主要是因为我认为混合使用C(或任何其他不限制内存访问的语言)和XML是一个非常糟糕的主意。C中ASN.1编码/解码中的溢出次数已经够糟糕的了,我甚至不想知道这对XML有什么影响。