2012-05-31 15 views
7

我正在嘗試使用Keytool和我的算法創建密鑰存儲。使用自定義算法的鍵工具

我已經構建了具有SignatureSPI,MessagedigestSPI和KeyPairGeneratorSPI擴展類的自定義java.security.provider,並將其靜態安裝。

問題我遇到的是當我嘗試使用創建存儲:

keytool -alias something -genkeypair -keyalg GOST2001KeyPairGenerator -sigalg GOST2001Signature -providerclass ru.test.security.test_provider -storetype pkcs12 -keystore test_keystore 

我讓我的調試消息和錯誤:

GOST2001KeyPairGenerator initialize 
GOST2001KeyPairGenerator generateKeyPair 
GOST2001Signature engineInitSign 
keytool error: java.lang.RuntimeException: internal error! unrecognized algorithm name: GOST2001Signature 

奇怪的是,居然算法開始執行但之後被稱爲無法識別。無法弄清楚發生了什麼問題。

+0

您是否試圖首先使用簡單的Java程序來使用它?我認爲您的提供商不會被認可,除非它由Oracle簽署。 –

+0

我做到了。 1.我使用addProvider測試了所有的類。 2.然後我已經靜態添加它,並再次使用我的java程序算法實例調用standart方法。一切正常,直到我使用Keytool,這就是問題出現的地方。 –

+0

謝謝,能否請您發佈完整的堆棧跟蹤?這[鏈接](http://bouncy-castle.1462172.n4.nabble.com/Unable-to-create-GOST3410-keypair-with-keytool-td1463711。html)可能會顯示一些壞消息。 –

回答

1

那麼,如果沒有能夠查看程序在您的算法中所取得的進展,就很難說出發生了什麼。嘗試跟蹤程序中實際用於調試消息的部分,以便了解哪些是有效的,哪些不是。

如果有RuntimeException,它可能會陷入循環。如果算法GOST2001Signature是無法識別的可能性,那麼可能存在問題。如果它工作了一次,也許你沒有第二次初始化它。通常,當我編寫程序的一部分工作了一次,但不是第二次,我忘了初始化導致它改變結果等等。

祝你好運。我希望我的建議有所幫助。

1

這裏我做了什麼:

  • 你需要讓你一罈定製的提供者,它需要的類。
  • 接下來,您需要將該jar放入:C:\ Program Files \ Java \ jre6 \ lib \ ext
  • 將security.provider.7 = my.package.MyProvider添加到java.security(7是下一個int的順序)。
  • 在關鍵工具命令行上使用選項-providerName MYPROVIDERNAME
  • 如果您打算使用-providerClass,請確保您使用完全限定名稱,而不僅僅是類名稱。

應該這樣做..

如果沒有,修正選項之後,你仍然可以獲得一個NoSuchProviderException(使用-providerName)或ClassNotFoundException的(使用-providerClass),請確認您使用的是正確副本的keytool。也就是說,在執行時,指定keytool的完整路徑,而不是依賴PATH變量。確保路徑指向您的提供程序安裝到的JRE。許多系統(如我的)都安裝了多個JRE/JDK。

祝你好運。

+0

獲獎無法測試正確性,不幸的是,作者無法及時做出迴應。儘管這似乎是一個明智的答案。 –

+0

許多thx,它確實爲我工作,所以我希望它會幫助你們中的一些人。 – Frank

+0

原始問題是因爲keytool在運行時無法識別算法。它與提供商無關,因爲您可以看到問題所在。我已經正確安裝了提供程序,Java將它掛鉤並開始調用方法。反正這很好你的答案幫助了某人。問題不再是我的實際,但我已經設法通過OPENSSL API創建了PKCS#12容器。 –