导入证书后出现 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 :证书导入给出错误消息 - 密钥库被篡改,或密码不正确