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

奇怪的是该算法实际上开始执行但之后被称为无法识别。不知道出了什么问题。

4

2 回答 2

1

好吧,如果不能查看程序在您的算法中取得的进展,就很难判断发生了什么。尝试跟踪实际处理调试消息等的程序部分,以便了解哪些有效,哪些无效。

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

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

于 2012-05-31T17:55:04.327 回答
1

这是我所做的:

  • 您将需要为您的自定义提供程序及其所需的类制作一个 jar。
  • 接下来,您需要将该 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。

祝你好运。

于 2012-10-20T15:18:31.507 回答