2014-09-26 49 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