[英]Signing a Text in Java Using a (.PFX) Certificate Generated Under Windows
我們使用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對文本進行簽名。 我們沒有遇到任何編碼問題,並且java.security.Signature
的initVerify()
方法返回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.