簡體   English   中英

使用Windows下生成的(.PFX)證書在Java中簽名文本

[英]Signing a Text in Java Using a (.PFX) Certificate Generated Under Windows

我們使用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檢索到的私鑰對文本消息進行簽名

我們使用Java 7對文本進行簽名。 我們沒有遇到任何編碼問題,並且java.security.SignatureinitVerify()方法返回true 問題在於,當使用.Net平台在Windows上對代碼進行簽名時,簽名與Java生成的簽名不同。 這兩個應用程序都使用帶有RSA的SHA256。

在下面找到我們用來對文本進行簽名的代碼示例:

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

您的Java代碼和密鑰庫看起來不錯。

也許C#和Java中的文本編碼不同,並且您獲得了不同的字節數組進行簽名。 在這種情況下,您將得到不同的結果。 嘗試在簽名之前比較原始字節。

也許您使用的密鑰不同-請在兩個平台上仔細檢查私鑰的路徑。

可能是因為.NET代碼默認為PSS,並且您已在Java中指定了PKCS#1 v1.5兼容的填充( "SHA256WithRSA" )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM