导入证书后 Java Keytool 错误,“keytool 错误:java.io.FileNotFoundException & Access Denied”

问题描述 投票:0回答:15

我正在尝试通过 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)
java ssl ssl-certificate keytool
15个回答
334
投票

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


55
投票

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

Certificate was added to keystore
keytool error: java.io.FileNotFoundException: C:\Program Files\Java\jdk1.8.0_151\jre\lib\security (Access is denied)

以下解决方案对我有用。

  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
这样的完整路径。

希望这会起作用


28
投票

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


15
投票

检查密钥库的写入权限。


7
投票

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


2
投票

如果您使用的是Windows8:

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

2
投票

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

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

所以解决办法是:

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

2
投票

要解决此问题,您必须以管理员身份访问或授予用户权限的完全控制权。它解决了我的问题。


1
投票

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

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

这对我有用。


1
投票

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

'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

这对我有用。


1
投票

确保您以管理员身份运行。 在 Mac 终端中:-

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

1
投票

对于 Mac 使用以下命令

  sudo keytool -importcert -file ~/certificate-file.cer -keystore $(/usr/libexec/java_home)/lib/security/cacerts

下面将为您提供cacerts的位置。

/usr/libexec/java_home

0
投票

我们的密钥库存储在SCM中,由于某种原因再次直接从SCM服务下载文件,启用了修改密钥库。 可能之前下载的文件没有以二进制格式提供。


-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

enter image description here


-3
投票

已解决

  1. 只需以管理员身份运行CMD即可。
  2. 确保您使用正确的信任库密码
© www.soinside.com 2019 - 2024. All rights reserved.