2012-04-13 44 views
3

我正在使用一個服務器,要求登錄URL的一部分包含認證。該方案的工作(如手冊推薦)的方式是如何使用openssl來模擬Java簽名方法?

  • 公鑰/私鑰對使用
  • 一個證書生成的Java JDK密鑰工具(這將創建他們在一個Java密鑰庫)生成密鑰對使用Java JDK keytool
  • 證書安裝在服務器上。

當客戶端在登錄(我的代碼)

  • 產生一個明文的令牌字符串
  • 跡象明文的令牌字符串使用私鑰使用SHA1和DSA
  • 包括簽名令牌字符串在登錄URL中。

Java的密鑰工具不提供一種機制來從導出密鑰庫中的私有密鑰,但分開我的Java代碼來提取密鑰庫中的私有密鑰並將其保存在一個文件 - 基於How do I list/export private keys from a keystore?

這一切都適用於客戶端使用Java進行簽名,代碼如下所示。

String plaintext = "This is a sample plaintext token string"; 
Signature instance = Signature.getInstance("SHA1withDSA"); 
instance.initSign(privateKey); 
instance.update((plaintext).getBytes()); 
byte[] signature = instance.sign(); 

它也適用於客戶端使用PHP執行簽名,代碼如下所示。這裏的私有密鑰從PHP中的Java密鑰庫文件中檢索]

$privateKey = openssl_pkey_get_private("file://$keyfile", $keystorePassword); 
openssl_sign($paramsEncoded, $signature, $privateKey, OPENSSL_ALGO_DSS1)) 

不過,我現在有一個顧客想要構建使用bash腳本和OpenSSL登錄URL的情況 - 那是行不通的。我的最新版本的代碼如下所示,它執行SHA1消息摘要,然後是DSA標誌。但服務器拒絕令牌。

echo $tokenString | openssl dgst -sha1 > tokendigest 
openssl dgst -dss1 -passin pass:$storePassword -sign $privateKeyFile > tokensigned 

我碰到這個職位(Using SHA1 and RSA with java.security.Signature vs. MessageDigest and Cipher),這意味着Java簽名標誌方法不簽字的摘要,而是標誌摘要算法ID和摘要的級聯。在逐步完成帖子中的代碼之後,看起來(對於SHA1)摘要需要以字節48 33 48 9 6 5 43 14 3 2 26 5 0 4 20作爲前綴。但即使在添加之後,仍然無法讓opensll生成服務器可以接受的簽名標記。

有誰知道如何使用openssl來模擬Java簽名方法嗎?

回答

2

另一篇文章是紅鯡魚。 DSA的工作方式與RSA不同,不使用MessageDigest前綴。

openssl dgst -dss1應該直接工作(它包括SHA1消化)。

你試過這個嗎?

echo -n $tokenString | 
    openssl dgst -dss1 -passin pass:$storePassword -sign $privateKeyFile > tokensigned 
+0

我只是試着用相同的「令牌登錄錯誤」結果。我甚至添加了一個openssl驗證(如下所示) - openssl在其中報告了驗證正常。 'echo $ tokenString | openssl dgst -dss1 -passpass pass:$ storePassword -sign $ privateKeyFile> $ signedTokenOpensslFile echo $ tokenString | openssl dgst -dss1 -verify $ publicKeyFile -signature $ signedTokenOpensslFile' – Torid 2012-04-13 17:58:37

+0

@Torid:您的問題可能是'echo'添加到字符串中的額外新行。試試'echo -n'。 – 2012-04-13 18:33:58

+0

是的。 'echo -n'固定它。我喜歡stackoverflow.com - 即使它讓我感覺有點愚蠢。謝謝! – Torid 2012-04-13 19:05:45