使用在Windows下生成的(.PFX)证书在Java中签名文本

时间:2014-09-26 07:12:52

标签: java cryptography digital-signature pfx

我们在使用Windows下生成的.pfx证书在Java中签署一串文本时遇到问题。首先,我们按照下面显示的顺序在Ubuntu Linux 12.0.4 LTS上执行以下步骤:

  1. 使用以下命令将.pfx证书转换为java密钥库(jks):

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

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

    • 包含私钥(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

  6. 检索到的私钥对短信进行签名

    我们使用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()));
    

2 个答案:

答案 0 :(得分:0)

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

在C#和java中,文本编码可能不同,并且您需要使用不同的字节数组进行签名。在这种情况下,您将获得不同的结果。尝试在签名之前比较原始字节。

也许你使用不同的密钥 - 在两个平台上仔细检查私钥的路径。

答案 1 :(得分:0)

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