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

Posted

技术标签:

【中文标题】导入证书后出现 Java Keytool 错误,“keytool 错误:java.io.FileNotFoundException & Access Denied”【英文标题】:Java Keytool error after importing certificate , "keytool error: java.io.FileNotFoundException & Access Denied" 【发布时间】:2012-05-06 11:09:44 【问题描述】:

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

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

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

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

    将证书导出到我电脑上的某个路径,证书保存为.cer

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

    keytool -import -alias downloadedCertAlias -keystore C:\path\to\my\keystore\cacerts.file -file C:\path\of\exportedCert.cer
    

    在命令提示符处提示我输入密码,然后我输入了密码,然后通过了身份验证。

    cmd 窗口打印了一些证书数据和签名,我被提示了一个问题:

    信任此证书?

    我回答是的。

    显示的cmd提示符

    证书已添加到密钥库

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

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

最后,当我检查 keystore 时,没有添加 SSL 证书,我的应用程序给出了与我之前尝试连接时相同的异常:

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

【问题讨论】:

您能否发布您已执行的确切keytool 命令,它的输出?这里的一些明显问题是 -keystore 参数的拼写错误,以及 keytool 无法找到将密钥导入的密钥库 我的意思是写:keytool -import -alias deletedCertAlias -keystore C:\path\to\my\keystore\cacerts.file -file C:\path\of\exportedCert.cer 我也提到过命令执行没有错误,所以显然这只是我的问题中的拼写错误!!!还是谢谢 【参考方案1】:

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

【讨论】:

对于 Mac 用户,一个简单的 sudo 就可以解决这个问题。 以管理员身份运行不是正确的解决方案。大多数公司都在锁定管理员访问权限。最好解决访问被拒绝的原因,而不是提升特权。 输入 cmd 并按 Ctrl+Shift+enter 并成功添加证书 - 它对我有用 谢谢。 control-shift CMD 是我可以更改 cacerts 存储的唯一方法。 说真的,我不断收到此错误,而且它是公司的笔记本电脑,我没有机会以管理员身份运行任何东西。这里的大多数答案都依赖于能够以管理员身份运行,这一事实令人沮丧。【参考方案2】:

我在本地密钥库中导入证书时遇到了同样的问题。每当我发出 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 参数值中提供“cacerts”,因为我提供了完整路径,例如“C**:\Program Files\Java\jdk1.8.0_151\ jre\lib\security**"。

希望这会奏效

【讨论】:

正如这里提到的,实际上是 in 安全目录并且 only 给出证书的“cacerts”名称而不是完整路径是什么为我工作。 我在 Mac 上的第一步中使用 sudo -i 让自己成为超级用户,然后按照这些步骤操作,它奏效了。我将插入符号文件作为文本文件打开,并通过执行命令 f 搜索其名称(或与证书相关的任何其他内容)找到了我的证书。 做一个cd $JAVA_HOME/jre/lib/security 然后确保只通过-keystore cacerts 而没有路径为我解决了这个问题..【参考方案3】:

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

【讨论】:

【参考方案4】:

检查密钥库的写入权限。

【讨论】:

如果有人可以对此进行扩展,仅检查权限不会改变任何内容。 设置tomcat目录为只读会导致这个异常 如何查看weite权限?【参考方案5】:

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

【讨论】:

【参考方案6】:

如果你使用的是windows8:

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

【讨论】:

【参考方案7】:

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

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

这对我有用。

【讨论】:

【参考方案8】:

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

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

所以解决办法是:

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

【讨论】:

【参考方案9】:

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

'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

这对我有用。

【讨论】:

【参考方案10】:

您可以存储或存储其他磁盘或路径(不是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

【讨论】:

【参考方案11】:

已解决

    只需以管理员身份运行 CMD。 确保您使用正确的信任库密码

【讨论】:

以上是关于导入证书后出现 Java Keytool 错误,“keytool 错误:java.io.FileNotFoundException & Access Denied”的主要内容,如果未能解决你的问题,请参考以下文章

keytool :证书导入给出错误消息 - 密钥库被篡改,或密码不正确

JAVA Tomcat SSL数字证书安装指南

使用Keytool为JDK添加https证书信任

利用JDK自带的keytool生成SSL证书然后导入到SpringBoot

keytool导出的p12无法导入

使用keytool 生成证书