2014-09-26 56 views
2

我们在使用Windows下生成的.pfx证书对Java中的文本字符串进行签名时遇到问题。首先,我们在执行上的Ubuntu Linux操作系统12.0.4 LTS下面示出的顺序执行以下步骤:使用在Windows下生成的(.PFX)证书对Java文本签名

openssl pkcs12 -in SupportTest-.pfx -out tempcertfile.crt -nodes

  1. 使用下列命令转换的.pfx证书到Java密钥库(JKS)

  2. Splited证书成两个单独的文件:

    • 甲包含私有密钥文件(key.pem)

    • 含有其余的另一个文件(cert.pm)

  3. 导出在点2中的密钥证书),以类型PKCS12

    openssl pkcs12 -export -in cert.pm -inkey key.pem -out aKeystore.p12 -name akeystore

  4. 转换PKCS12密钥库的密钥库到java密钥库jks

    keytool -importkeystore -srckeystore aKeystore.p12 -srcstoretype PKCS12 -deskeystore akeystore.jks -destoretype jks

  5. 从JKS检索到的私有密钥签名的短信ketstore

我们使用Java 7的签署文本。我们没有遇到任何编码问题,并且java.security.Signature中的initVerify()方法返回true。问题是,当使用.Net平台在Windows上签署代码时,签名与Java生成的签名不同。这两个应用程序都使用SHA256和RSA。

查找下面我们用来签署文本代码示例:

Signature signature = Signature.getInstance("SHA256WithRSA"); 
signature.initSign(privateKey); 
signature.update(dataToSign); 
return new String(Base64.encodeBase64(signature.sign())); 
+0

请添加java代码示例,在其中签名文本。 – user1516873 2014-09-26 08:19:27

回答

0

Java代码和密钥库看起来不错。

也许文本编码在C#和java中是不同的,并且你得到不同的字节数组来签名。在这种情况下,你会得到不同的结果。尝试在签名前比较原始字节。

也许您正在使用不同的密钥 - 双重检查两个平台上私钥的路径。

0

这可能是因为.NET代码默认为PSS,并且您已经在Java中指定了与PKCS#1 v1.5兼容的填充("SHA256WithRSA")。

+0

没有.NET代码,当然很难确定,请添加。我假设你已经检查了输入(dataToSign)在两个平台上完全相同 - 以字节为单位。 – 2014-10-01 10:10:31

+0

在这方面的任何进展,文森特? – 2014-10-03 13:44:41