2012-07-17 104 views
5

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

下面是我的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代码来提取私有密钥,代码是如下 `密钥库KS = KeyStore.getInstance( “JKS”);同时使用Java和Perl

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.....");` 

,因为我想签个XML是在Perl(这是一个整体的大系统)和密钥库是在Java。

首次进行数字签名任何东西,我的数字签名的XML不验证在所有接收者系统

+0

或许,如果你添加一个用于生成Java私钥'keytool'命令可能会有所帮助。 – 2012-07-17 10:14:02

+0

刚刚添加了用于生成私钥的代码 – qateey 2012-07-17 12:40:25

回答

1

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

是的,输入是一个X509键,输出是一个RSA键。 openssl rsa -in my_priv.key给出了相同的结果。

如果你不知道这个东西,你最好用高级库。

+0

我曾尝试使用XML-Sig,但它没有与我的应用程序一起工作,产生的xml未经过身份验证,认为我会使用此方法来更好地理解整个过程,我对数字签名和openssl有点新了 – qateey 2012-07-17 12:42:54

+1

@qateey和@daxim,'XML :: Sig'是*不是一个好的推荐:http://matrix.cpantesters.org/?dist=XML-Sig+ 0.22,'Net :: SAML2',另一方面:http://matrix.cpantesters.org/?dist=Net-SAML2+0.17 – Axeman 2012-07-17 13:16:32

+0

Axeman,你必须学会​​正确地阅读汇总的自动测试报告。你应该怀疑全红的结果!在XML-Sig的情况下,只有一个依赖项缺失。这掩盖了DSA和PKCS#8密钥的真正问题,但只要qateey保持RSA密钥,该模块就可以完美地服务。 – daxim 2012-07-17 16:11:09