Perl 中的 XML 数字签名

Posted

技术标签:

【中文标题】Perl 中的 XML 数字签名【英文标题】:XML digital signatures in Perl 【发布时间】:2012-07-16 03:24:34 【问题描述】:

我正在尝试使用 Crypt::OpenSSL::RSA 模块在 Perl 中对 XML 进行数字签名。我正在从文件中加载私钥。私钥是使用 Java 从密钥库生成的。

下面是我的 Perl 代码:

my $private = 'my_priv.key';
my $private_key = read_file( $private );
print "my private key text is\n", $private_key;

输出,不是把整个密钥放在这里,只是前几行:-)

> -----BEGIN PRIVATE KEY----- MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKAuqJ1ZkxHZStfSt0CdEsaSYuLO
> 6zDiTpt60asVLWpLe2bf...

my $rsa_priv = Crypt::OpenSSL::RSA->new_private_key($private_key);
print "my private key is\n",$rsa_priv->get_private_key_string();

输出:

> -----BEGIN RSA PRIVATE KEY-----
> MIICXAIBAAKBgQCgLqidWZMR2UrX0rdAnRLGkmLizusw4k6betGrFS1qS3tm3+97
> wMvFXCx0Od8eb

$private_key$rsa_priv->get_private_key_string() 的结果不同。它应该表现得像那样吗?

有没有人能够使用Crypt::OpenSSL::RSA 签署 XML?

编辑:

我正在使用java代码提取私钥,代码如下 `KeyStore ks = KeyStore.getInstance("JKS");

keypass = sPass.toCharArray();

FileInputStream fis = new FileInputStream(store);
ks.load(fis, sPass.toCharArray());
fis.close();

String eol = System.getProperty("line.separator");

Key k = ks.getKey(alias, keypass);

System.out.println("....Generating the Private Key.....");
String encKey = new BASE64Encoder().encode(k.getEncoded());
System.out.println("Encoded Key: " + encKey);
BufferedWriter myKey = null;
myKey = new BufferedWriter(new FileWriter(alias + "_priv.key"));
myKey.write("-----BEGIN PRIVATE KEY-----" + eol);
myKey.write(encKey + eol);
myKey.write("-----END PRIVATE KEY-----");
myKey.close();
System.out.println("....Private Key Generated.....");`

同时使用 java 和 perl,因为我要签名的 xmls 在 perl 中(这是一个很大的系统),而密钥库在 java 中。

第一次对任何东西进行数字签名,而我的数字签名 xml 根本没有对收件人系统进行身份验证

【问题讨论】:

如果您添加用于生成 Java 私钥的 keytool 命令可能会有所帮助。 刚刚添加了用于生成私钥的代码 【参考方案1】:

$private_key;$rsa_priv->get_private_key_string(); 的结果不同,这应该是这样吗?

是的,输入是 X509 密钥,输出是 RSA 密钥。 openssl rsa -in my_priv.key 给出相同的结果。

如果您对这些东西一无所知,最好使用高级库。

XML-Sig Net-SAML2

【讨论】:

我曾尝试使用 XML-Sig,但它不适用于我的应用程序,生成的 xml 未经过身份验证,我想我会使用这种方法来更好地理解整个过程,我数字签名和openssl有点新 @qateey 和 @daxim,XML::Sig不是 一个好的推荐:matrix.cpantesters.org/?dist=XML-Sig+0.22,`Net::SAML2',另一方面:matrix.cpantesters.org/?dist=Net-SAML2+0.17 Axeman,你必须学会​​正确阅读总结的自动化测试报告。你应该怀疑一个全红的结果!在 XML-Sig 的情况下,只是缺少一个依赖项。这掩盖了 DSA 和 PKCS#8 密钥的真正问题,但只要 qateey 保持 RSA 密钥,该模块就可以完美地服务。 @daxim,发现我的问题完全是因为我使用的密钥格式,使用 XML::SIG 和 Crypt::OpenSSl::RSA,密钥被转换为 rsa 格式,但是我发送请求的系统期望使用 pkcs#8 格式密钥创建的签名,是否有我可以使用的模块可以使用 pkcs#8 密钥而不是 rsa 对数据进行签名

以上是关于Perl 中的 XML 数字签名的主要内容,如果未能解决你的问题,请参考以下文章

如何区分 Perl 中的数字标量和字符串标量?

我应该使用 \d 还是 [0-9] 来匹配 Perl 正则表达式中的数字?

perl快速获得数字在数组中的排序

Perl中的标量介绍

perl中每行有多个要匹配的字符串怎么取?

如何使用 Perl 中的正则表达式匹配字符串中第 n 个索引处的字符/字母/符号/数字