【问题标题】:Keytool with custom algorithms具有自定义算法的 Keytool
【发布时间】:2012-05-31 13:50:40
【问题描述】:

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

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

【问题讨论】:

  • 您是否首先尝试让它与一个简单的 Java 程序一起工作?我认为除非您的提供商得到 Oracle 的签名,否则它不会被认可。
  • 我做到了。 1. 我已经使用 addProvider 测试了我的所有课程。 2. 然后我静态地添加了它,并再次使用我的算法实例从 java 程序中调用标准方法。在我使用 Keytool 之前一切正常,这就是问题出现的地方。
  • 谢谢,你能发布一个完整的堆栈跟踪吗?这个link 可能预示着一些坏消息。
  • 上层消息是我所得到的。它完全执行 engineInitSign,然后只打印该内部错误。
  • 您是如何注册您的安全提供商的? jar 位于 $JAVA_HOME/jre/lib/ext 中,提供程序类添加到 $JAVA_HOME/jre/lib/security/java.security 中,如security.provider.XXX=foo.bar.SecurityProvider,对吗?

标签: java linux cryptography keytool


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我做了什么:

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

    祝你好运。

    【讨论】:

    • 在无法测试正确性的情况下获得了赏金,遗憾的是作者也未能及时回复。不过,这似乎是一个明智的答案。
    • 非常感谢,它确实对我有用,所以我希望它对你们中的一些人有所帮助。
    • 原来的问题是因为keytool在运行时无法识别算法。如您所见,它与提供者无关。我已经正确安装了提供程序,java 将它连接起来并开始调用方法。无论如何,很高兴您的回答帮助了某人。不过,问题对我来说不再是实际的,我已经设法通过 OPENSSL API 创建了 PKCS#12 容器。
    猜你喜欢
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    相关资源
    最近更新 更多