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

cyb*_*101 111 java ssl keytool ssl-certificate

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

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException
Run Code Online (Sandbox Code Playgroud)

我遵循了从在线keytool和SSL证书教程中学到的这些步骤:

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

  2. 将证书导出到计算机上的路径,证书保存为 .cer

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

    keytool -import -alias downloadedCertAlias -keystore C:\path\to\my\keystore\cacerts.file -file C:\path\of\exportedCert.cer
    
    Run Code Online (Sandbox Code Playgroud)
  4. 我在命令提示符下提示输入密码,然后我输入了密码.

  5. cmd窗口打印一些证书数据与签名,我是这样一个问题提示:

    相信这个证书?

    我回答是的.

  6. 显示cmd提示符

    证书已添加到密钥库

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

    keytool error: java.io.FileNotFoundException: C:\Program files\...\cacerts <Access Denied>
    
    Run Code Online (Sandbox Code Playgroud)

最后,当我检查密钥库时,没有添加SSL证书,我的应用程序提供了我在尝试连接时得到的相同异常:

(javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException)
Run Code Online (Sandbox Code Playgroud)

小智 242

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

  • 以管理员身份运行不是正确的解决方案.大多数公司都在锁定管理员权限.最好解决为什么访问被拒绝而不是提升普遍性的原因. (11认同)
  • 对于Mac用户,一个简单的sudo将解决这个问题. (9认同)
  • 说真的,我一直收到这个错误,而且这是一台公司笔记本电脑,我根本不可能以管理员身份运行任何东西。事实上,这里的大多数答案都依赖于能够以管理员身份运行,这一点令人沮丧。 (3认同)

dan*_*iel 19

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


Waq*_*med 14

在本地密钥库中导入证书时遇到了同样的问题.每当我发出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 -import -alias"mycertificatedemo"-file"C:\ Users \name\Downloads\abc.crt"-keystore cacerts

3)给密码更改

4)输入y

5)成功将"证书添加到密钥库"后,您将看到以下消息

确保你只在-keystore param值中给出" cacerts ",因为我给出的完整路径如"C**:\ Program Files\Java\jdk1.8.0_151\jre\lib\security**".

希望这会奏效

  • 正如这里提到的,实际上_在_安全目录中并且_仅_给出证书的“cacerts”名称而不是完整路径对我有用。 (2认同)
  • 执行 `cd $JAVA_HOME/jre/lib/security` ,然后确保只传递 `-keystore cacerts` 而没有路径解决了我的问题。 (2认同)

小智 10

检查密钥库的写入权限.

  • 如果有人可以对此进行扩展,仅检查权限不会改变任何内容。 (2认同)

小智 7

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