Keytool不被识别为内部或外部命令

48

我正在尝试使用这篇文章中的指示,发现我Java Runtime中的受信任机构列表。当我输入以下命令时:

C:\ColdFusion8\runtime\jre\lib>keytool -list -storepass changeit -noprompt -keystore

我遇到了以下错误:

'keytool' 不是内部或外部命令,也不是可运行的程序或批处理文件。

我检查了包含 keytool 可执行文件的目录是否在路径中。 (在我的 Windows 7 机器上,它位于 C:\Program Files (x86)\Java\jre6\bin) 尽管如此,命令行仍无法识别 keytool 命令。

我假设文档中提到了两个分开的命令:

  1. C:\CFusionMX\runtime\jre\lib>keytool -list -storepass changeit -noprompt -keystore

  2. C:\CFusionMX\runtime\jre\lib\security\cacerts

编辑:

顺便问一下,我可以使用以下过程代替答案中提到的复杂步骤吗?

  1. 当我在浏览器中打开 WSDL 时,看到了锁图标,当我单击它时,会打开“证书”窗口
  2. 然后我单击“安装证书”选项

  3. 证书导入向导窗口打开,我单击下一步,看到两个选项

    • a) 根据证书类型自动选择证书存储区(此选项已自动选择)
    • b) 将所有证书放入以下存储区

我决定选择选项 (b),但我不确定应该在这里选择哪个证书存储区。


当你在可执行文件中遇到错误时,请始终运行 dir 命令以验证路径,例如 c:/current/path > dir C:\ColdFusion8\runtime\jre\lib\keytool.exe。 (这将告诉你 keytool.exe 的路径是错误的,就像 Miguel-F 指出的那样) - Leigh
嗨,Leigh,你认为我上面提到的另一种方法可行吗? - Jack
据我所知,IE默认使用自己独立的密钥库,所以我的直觉是说“不行”。但是我真的不确定。我很少使用IE。这可能取决于IE是否列出/可以访问您正在尝试使用的Java存储。话虽如此,我不确定通过命令行添加证书有什么复杂之处 :)只需使用正确的.exe路径,您就可以开始了。 - Leigh
8个回答

56
  1. 将你的JDK的/bin文件夹添加到PATH环境变量中。你可以在系统设置 > 环境变量中进行此操作,或者通过CLI实现:

set PATH=%PATH%;C:\Program Files\Java\jdk1.7.0_80\bin
  • 关闭并重新打开您的命令行窗口


  • 1
    哦,我的在关闭/打开命令窗口后不会保留。 - pete
    1
    我记得这个救了我的命 :D 我又遇到问题了,这个再次帮了我,我没有找到其他能帮助我的解决方案。非常感谢您的分享。@pete 请确保添加正确的jdk版本,对我来说是C:\Program Files\Java\jdk1.8.0_73\bin。 - User 987
    keytool会为JRE和JDK导入证书吗?还是需要分别运行keytool? - Stevoisiak
    感谢您。下一步是“openssl”未被识别为内部或外部命令,可执行程序或批处理文件。 - Someone Somewhere
    它不起作用。我正在使用最新的JDK。Android Studio已经预装了JRE,所以我不需要单独使用任何JRE。我只有AS的JDK。 - raman raman

    29
    你遇到了这个错误是因为keytool可执行文件在你的示例中不在lib目录下,而是在bin目录下。此外,您还需要在命令行中添加keystore的位置。这里有一个相当好的参考资料 - Jrun Help / Import certificates | Certificate stores | ColdFusion

    默认的信任存储库是JRE的cacerts文件。该文件通常位于以下位置:

    • 服务器配置:

      cf_root/runtime/jre/lib/security/cacerts

    • Multiserver/J2EE on JRun 4配置:

      jrun_root/jre/lib/security/cacerts

    • Sun JDK安装:

      jdk_root/jre/lib/security/cacerts

    • 请参阅其他J2EE应用程序服务器和JVM的文档


    keytool是Java SDK的一部分,可以在以下位置找到:

    • 服务器配置:

      cf_root/runtime/bin/keytool

    • Multiserver/J2EE on JRun 4配置:

      jrun_root/jre/bin/keytool

    • Sun JDK安装:

      jdk_root/bin/keytool

    • 请参阅其他J2EE应用程序服务器和JVM的文档

    因此,如果您导航到包含keytool可执行文件的目录,您的命令行将如下所示:

    keytool -list -v -keystore JAVA_HOME\jre\lib\security\cacert -storepass changeit
    

    根据您执行keytool命令的位置以及证书文件所在的位置,您需要提供路径信息。

    此外,请确保您正在更新ColdFusion使用的正确cacerts文件。如果您在该服务器上安装了多个JRE,请进行验证。您可以从管理员下的“系统信息”查找Java Home行来查找ColdFusion正在使用的JRE。


    谢谢你的回答。你认为我在问题中添加的替代选项会起作用吗?如果是,请回答我在那里提出的问题。只是想避免上面提到的所有复杂步骤。 - Jack
    顺便提一下,如果不明显的话,“changeit”只是默认密码。出于安全考虑,应该将其更改为更安全的密码。 - Leigh
    @Miguel-F 你知道在哪里可以找到IE自动保存的证书吗? - Jack
    @nitantkumar - 我会将这个答案留下来,因为它回答了你在这里发布的原始问题。为什么会收到错误消息以及如何检索当前安装证书列表。现在你正在询问关于如何安装证书的另一个问题。如果这个答案对你有用,请接受它,然后提出一个关于安装过程的新问题。这样可以减少那些可能在以后找到这个线程的人的困惑。不用开新问题了,我找到了你的其他问题并会在那里回答 https://dev59.com/bnjZa4cB1Zd3GeqPZQ1p - Miguel-F
    1
    @ramanraman,自版本11以来已经发生了变化(我相信)。请参阅此答案以获取详细信息。 - Miguel-F
    显示剩余2条评论

    11

    管理员身份运行CMD,这对我有用。


    尝试了上面关于将环境路径设置为不同位置以查找keytool的答案,但都没有起作用。奇怪的是,以管理员身份运行后它就可以工作了。运行Win10 x64。 - ZeferiniX

    3

    执行以下命令:

    set PATH="C:\Program Files (x86)\Java\jre7"

    (如果是64位系统,则使用存在的 JRE )。

    由于您的Java路径未设置,因此您可以在命令行中执行此操作,然后执行 keytool 导入命令。


    3

    我终于解决了这个问题!!! 您应该首先通过导航到以下位置将 jre 路径设置为系统变量:

    control panel > System and Security > System > Advanced system settings 
    

    在“系统变量”下,单击“新建”。
    Variable name: KEY_PATH
    Variable value: C:\Program Files (x86)\Java\jre1.8.0_171\bin
    

    变量值应该是您的JDK bin文件夹的路径。

    然后打开命令提示符并切换到相同的JDK bin文件夹,就像这样:

    C:\Program Files (x86)\Java\jre1.8.0_171\bin 
    

    然后粘贴,

    keytool -list -v -keystore "C:\Users\user\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android   
    

    注意:人们经常混淆JRE和JDK。我所做的一切仅适用于JRE

    1
    很高兴你解决了问题。顺便提一下,原始问题是关于在ColdFusion的自定义Java安装中使用keytool,而不是Android。对于任何使用CF的人来说,上述方法都行不通(不同的路径,默认密码等)。请参见已接受的答案https://dev59.com/pGIk5IYBdhLWcg3wRMNR#19432015。 - SOS

    1

    一个简单的解决错误的方法是,您需要先在命令提示符中更改文件夹目录。默认情况下,在命令提示符或终端(Android Studio底部)选项卡中, 路径设置为 C:\ Users#您选择的PC名称\ AndroidStudioProjects#应用程序名称\ flutter_app> 相应更改: C:\ Users#您选择的PC名称\ AndroidStudioProjects#应用程序名称\ flutter_app> cd \

    输入 **cd** (#在flutter_app>之后),仅输入cd \而不是逗号

    然后输入cd Program Files \ Java \ jre1.8.0_251 \ bin (#记得正确检查jre文件名)

    现在键入keytool -list -v -keystore“% USERPROFILE%.android \ debug.keystore”-alias androiddebugkey -storepass android -keypass android(不带任何空格键入命令)。

    要运行的代码的屏幕截图


    请正确格式化您的答案并将图像内联。 - Sandeep Kumar

    0

    确保已设置JAVA_HOME并在环境变量中设置了路径。PATH应该能够找到keytools.exe

    打开“Windows搜索”并搜索“环境变量”

    在“系统变量”下,单击“新建...”按钮,并将JAVA_HOME输入为“变量名称”,将Java JDK目录的路径输入为“变量值”,它应该类似于C:\Program Files\Java\jre1.8.0_231


    0

    我尝试了上面所有的解决方案,但都没有起作用。这是我做的,首先在路径窗口中定义了所有正确的路径;但是没有起作用。相反,我像这样在Android终端中定义它们:

    首先打开一个本地终端并像这样进入设置:

    terminal

    然后在设置中点击环境变量,就像这样:

    terimnal setting

    然后像这样设置实际变量:

    setting

    然后点击所有的OK按钮,在终端中输入keytool。应该就可以了。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接