导入证书后出现Java Keytool错误,"keytool error: java.io.FileNotFoundException & Access Denied"。

180

我正在尝试通过HTTPS连接Java Web API,但是会抛出异常:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException

我按照从在线keytool和SSL证书教程中学到的步骤进行操作:

  1. 将HTTPS URL复制到浏览器中,下载SSL证书并使用Internet Explorer安装它们。

  2. 将证书导出到计算机上的某个路径下,并以.cer格式保存。

  3. 使用keytool的导入选项。以下命令执行时没有任何错误。

    keytool -import -alias downloadedCertAlias -keystore C:\path\to\my\keystore\cacerts.file -file C:\path\of\exportedCert.cer
    
  4. 我在命令提示符处被要求输入密码,我输入后得到了认证。

  5. cmd 窗口打印了一些证书数据和签名,并询问:

    是否信任此证书?

    我回答是。

  6. 命令提示符显示:

    已将证书添加到密钥库

    然而,在该消息之后,另一个异常被显示:

    keytool error: java.io.FileNotFoundException: C:\Program files\...\cacerts <Access Denied>
    

最后当我检查密钥库时,发现SSL证书未被添加,因此我的应用程序在尝试连接时仍然会出现之前遇到的异常:

(javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException)

你能否发布你执行的确切“keytool”命令及其输出?这里一些明显的问题是“-keystore”参数的拼写错误,以及keytool无法找到要导入密钥的密钥库。 - Alex
我本意是要写的是:keytool -import -alias downloadedCertAlias -keystore C:\path\to\my\keystore\cacerts.file -file C:\path\of\exportedCert.cer。我还提到了命令执行没有错误,所以显然这只是我问题中的拼写错误!无论如何,还是谢谢。 - cyber101
14个回答

331

如果您没有以管理员身份运行命令提示符,就可能会出现这种情况。 如果您使用的是Windows 7,则可以进入“运行”,键入cmd并按Ctrl + Shift + Enter。 这将以管理员模式打开命令提示符。 如果没有,则还可以转到开始->所有程序->附件->右键单击命令提示符并单击“以管理员身份运行”。


19
对于Mac用户,简单的sudo命令可以解决这个问题。 - truthful_ness
22
以管理员身份运行并不是正确的解决方案。大多数公司都会限制管理员访问权限。最好修复被拒绝访问的原因,而不是提升特权。 - skword
1
输入cmd并按Ctrl+Shift+Enter,然后成功添加证书- 对我有效。 - deadend
谢谢。control-shift CMD 是我能够更改 cacerts 存储的唯一方法。 - Malcolm Boekhoff
@Afshar 非常感谢,我已经为此苦苦挣扎了很长时间。 - Rajan Chauhan
4
我一直遇到这个错误,而且这是公司的笔记本电脑,我根本没有机会以管理员身份运行任何东西。这里大多数答案依赖于管理员权限,这让人感到沮丧。 - quantumferret

47

在将证书导入本地密钥库时我遇到了同样的问题。每当我发出keytool命令时,我都会收到以下错误信息。

证书已添加到密钥库 keytool error: java.io.FileNotFoundException: C:\Program Files\Java\jdk1.8.0_151\jre\lib\security (拒绝访问)

以下解决方案对我有用:

1)确保以管理员身份运行命令提示符

2)将当前目录更改为%JAVA_HOME%\jre\lib\security

3)然后输入以下命令

keytool -import -alias "mycertificatedemo" -file "C:\Users\name\Downloads\abc.crt" -keystore cacerts

4)输入密码changeit

5)输入y

6)如果成功,将会看到以下消息 “Certificate was added to keystore”

请注意,在-keystore参数值中仅提供“cacerts”,不要像“C**:\Program Files\Java\jdk1.8.0_151\jre\lib\security**”这样提供完整路径。

希望这能起作用。


2
如本文所述,实际上进入安全目录并仅提供证书的“cacerts”名称而不是完整路径对我有效。 - risingTide
我在 Mac 上的第一步使用了 sudo -i 命令将自己设置为超级用户,并按照步骤进行操作顺利完成。我以文本文件的形式打开了 caret 文件,并通过执行 command f 命令来搜索证书名称(或任何与证书相关的信息)找到了它。 - Chigozie A.
2
我做了一个 cd $JAVA_HOME/jre/lib/security,然后确保只传递 -keystore cacerts 而不带路径,这为我解决了问题。 - AO_

27

我在Windows下遇到了同样的问题,通过以管理员身份运行cmd.exe(右键点击开始菜单,然后选择“以管理员身份运行”)解决了问题。


13

检查密钥库上的写入权限。


2
如果有人能够扩展这个,仅仅检查权限是不会改变任何东西的。 - user3071284
将Tomcat目录设置为只读会导致此异常。 - svarog
如何检查写入权限? - Ahmad Arslan

7

对于Mac用户,请确保使用sudo命令,并在提示时先输入您的管理员密码,然后是密钥库密码,通常应该是“changeit”,除非您实际上已经更改了它。


2

如果您正在使用Windows8:

  1. 点击开始按钮
  2. 在搜索框中输入命令提示符
  3. 从结果中,右键单击命令提示符并单击以管理员身份运行。 然后执行keytool命令。

2
我即使以管理员身份运行cmd也遇到了这个错误。 根本原因是:该文件来自版本控制系统(如subversion、perforce等),当我检查该文件的属性时,发现它的属性为“只读”。 因此解决方法是: (1)禁用“只读”属性; (2)从版本控制系统中检出,让文件处于读写状态。

哇,这个解决方案对我有效。非常感谢! - Jesse

1
为了解决这个问题,您需要以管理员身份访问或授予用户完全控制权限。我用这种方法解决了这个问题。

1

您可以为自己授予权限以解决此问题。

右键单击 cacerts > 选择属性 > 选择安全选项卡 > 允许所有组和用户名称的所有权限。

这对我有用。


1

请确保您以管理员身份运行。

在 Mac 终端中执行以下操作:

  1. 运行 sudo -i
  2. 然后执行命令

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