Keytool与自定义算法

时间:2012-05-31 13:50:41

标签: java linux cryptography keytool

我正在尝试使用我的算法使用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

奇怪的是,算法实际上开始执行但后来被称为无法识别。无法弄清楚出了什么问题。

2 个答案:

答案 0 :(得分:1)

嗯,如果不能查看程序在算法中所取得的进展,很难说出发生了什么。尝试跟踪程序中实际使用调试消息等的部分,以便了解哪些有效,哪些无效。

如果存在RuntimeException,它可能会陷入循环中。如果算法GOST2001Signature无法识别,则可能存在问题。如果它工作一次,也许你不会再次初始化它。通常当我编写的程序的一部分工作一次但不是第二次我忘记初始化导致它改变结果的东西时等。

祝你好运。我希望我的建议有所帮助。

答案 1 :(得分: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。

祝你好运。