我正在使用一個服務器,要求登錄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簽名方法嗎?
我只是試着用相同的「令牌登錄錯誤」結果。我甚至添加了一個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
@Torid:您的問題可能是'echo'添加到字符串中的額外新行。試試'echo -n'。 – 2012-04-13 18:33:58
是的。 'echo -n'固定它。我喜歡stackoverflow.com - 即使它讓我感覺有點愚蠢。謝謝! – Torid 2012-04-13 19:05:45