我们在使用Windows下生成的.pfx证书在Java中签署一串文本时遇到问题。首先,我们按照下面显示的顺序在Ubuntu Linux 12.0.4 LTS上执行以下步骤:
使用以下命令将.pfx证书转换为java密钥库(jks):
openssl pkcs12 -in SupportTest-.pfx -out tempcertfile.crt -nodes
将证书分成两个单独的文件:
包含私钥(key.pem)
包含其余文件的另一个文件(cert.pm)
将第2点中的密钥证书导出到PKCS12类型的密钥库
openssl pkcs12 -export -in cert.pm -inkey key.pem -out aKeystore.p12 -name akeystore
将pkcs12密钥库转换为java密钥库jks
keytool -importkeystore -srckeystore aKeystore.p12 -srcstoretype PKCS12 -deskeystore akeystore.jks -destoretype jks
使用从jks ketstore
我们使用Java 7对文本进行签名。我们没有遇到任何编码问题,initVerify()
中的java.security.Signature
方法返回true
。问题是当使用.Net平台在Windows上签名代码时,签名与Java生成的签名不同。两个应用程序都使用带有RSA的SHA256。
在下面找到我们用来签署文字的代码示例:
Signature signature = Signature.getInstance("SHA256WithRSA");
signature.initSign(privateKey);
signature.update(dataToSign);
return new String(Base64.encodeBase64(signature.sign()));
答案 0 :(得分:0)
您的Java代码和密钥库看起来不错。
在C#和java中,文本编码可能不同,并且您需要使用不同的字节数组进行签名。在这种情况下,您将获得不同的结果。尝试在签名之前比较原始字节。
也许你使用不同的密钥 - 在两个平台上仔细检查私钥的路径。
答案 1 :(得分:0)
这可能是因为.NET代码默认为PSS,并且您已在Java中指定了PKCS#1 v1.5兼容填充("SHA256WithRSA"
)。