导入证书后出现Java Keytool错误,“ keytool错误:java.io.FileNotFoundException&访问被拒绝”


128

我正在尝试通过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. 显示的cmd提示

    证书已添加到密钥库

    但是,在该消息之后,显示了另一个异常:

    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

Answers:


266

如果未在管理员模式下运行命令提示符,则可能会发生这种情况。如果您使用的是Windows 7,则可以运行,键入cmd,然后按Ctrl + Shift + Enter。这将在管理员模式下打开命令提示符。如果没有,您也可以开始->所有程序->附件->右键单击命令提示符,然后单击“以管理员身份运行”。


9
对于Mac用户,简单的sudo将解决此问题。
2014年

13
以管理员身份运行不是正确的解决方案。大多数公司都禁止管理员访问。最好解决拒绝访问的原因,而不是增加特权。
skword 2015年

键入cmd并按Ctrl + Shift + Enter并成功添加证书
有用

谢谢。控制移位CMD是我可以更改cacerts存储的唯一方法。
马尔科姆·勃霍夫

@Afshar非常感谢,我已经为此苦苦挣扎了很长时间。
Rajan Chauhan

21

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


19

在本地密钥库中导入证书时遇到相同的问题。每当我发出keytool命令时,都会出现以下错误。

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

以下解决方案为我工作。

1)确保您在Rus以管理员模式运行命令提示符

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

3)然后发出以下命令

keytool-导入-alias“ mycertificatedemo”-文件“ C:\ Users \ name \ Downloads \ abc.crt” -keystore cacerts

3)输入密码changeit

4)输入y

5)您将在成功的“证书已添加到密钥库”中看到以下消息

确保只在-keystore参数值中提供了“ cacerts ”,因为我给出了诸如“ C **:\ Program Files \ Java \ jdk1.8.0_151 \ jre \ lib \ security **”之类的完整路径。

希望这会起作用


1
如这里所提到的,实际上是安全目录,给了证书,而不是完整路径“的cacerts”的名字是为我工作。
上升潮

在Mac上的第一步中,我使用sudo -i使自己成为超级用户,然后按照以下步骤进行了工作。我将插入符号文件打开为文本文件,并通过执行命令f搜索其名称(或与证书有关的其他任何内容)来找到证书。
Chigozie A.


3

对于Mac用户,请确保使用sudo,并在出现提示时首先输入管理员密码,然后再输入密钥库密码,除非您实际更改,否则通常应为“ changeit”。


1

如果您使用的是Windows8:

  1. 点击开始按钮
  2. 在搜索框中,键入 command prompt
  3. 从结果中,右键单击command prompt并单击Run as administrator。然后执行keytool命令。

1

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

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

这对我有用。


0

我什至以管理员身份运行命令提示符,但由于以下错误,它对我不起作用。

'keytool' is not recognized as an internal or external command,
 operable program or batch file.

如果keytool的路径不在您的系统路径中,那么您将需要使用完整路径来使用keytool,即

C:\Program Files\Java\jre<version>\bin

所以,命令应该像

"C:\Program Files\Java\jre<version>\bin\keytool.exe" -importcert -alias certificateFileAlias -file CertificateFileName.cer -keystore cacerts

对我有用。


0

即使以管理员身份运行cmd,我也遇到此错误。

根本原因是:该文件来自VCS(subversion,perforce等),当我检查该文件的属性时,其“属性”为“ 只读”

因此解决方案是:

  • (1)禁用“只读”属性;
  • (2)从VCS中签出,让文件处于读写状态。


-2

您可以存储其他磁盘或路径(不是C)EX:D \

C:\Program Files\Java\jre1.8.0_101\bin>keytool -genkey -alias server -keyalg RSA -keysize 2048 -keystore D:\myserver.jks -dname "CN=myserver,OU=IT-WebDev, O=TIACHOP, L=HCM, ST=0753, C=VN" && keytool -certreq -alias server -file D:\myserver.csr -keystore D:\myserver.jks

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.