导入证书后出现Java Keytool错误,“keytool error:java.io.FileNotFoundException&Access Denied”
我试图通过HTTPS连接一个Java Web API; 然而,抛出一个exception:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException
我遵循以下从在线keytool和SSL证书教程中学到的步骤:
-
我将HTTPS URL复制到浏览器中,下载了SSL证书并使用Internet Explorer将它们安装在浏览器中。
-
将证书导出到我的计算机上的path,证书保存为
.cer
-
使用keytool的导入选项。 下面的命令执行没有任何错误。
keytool -import -alias downloadedCertAlias -keystore C:\path\to\my\keystore\cacerts.file -file C:\path\of\exportedCert.cer
-
系统提示input密码,然后input密码,然后进行身份validation。
-
cmd
窗口打印了一些证书数据和签名,我被提示问题:相信这个证书?
我回答是的。
-
显示cmd提示符
证书已添加到密钥库
但是在那个消息之后,显示了另一个exception:
keytool error: java.io.FileNotFoundException: C:\Program files\...\cacerts <Access Denied>
最后,当我检查密钥库时,没有添加SSL证书,并且我的应用程序给出了我之前在尝试连接时遇到的exception:
(javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException)
如果您没有以pipe理员模式运行命令提示符,可能会发生这种情况。 如果您使用的是Windows7,则可以运行,inputcmd,然后按Ctrl + Shift + Enter。 这将以pipe理员模式打开命令提示符。 如果没有,你也可以去开始 – >所有程序 – >附件 – >右键单击命令提示符,并说以pipe理员身份运行。
我在Windows下遇到了同样的问题,可以通过以pipe理员身份运行cmd.exe来解决这个问题(右键单击开始菜单,然后select“以pipe理员身份运行”)。
检查密钥库上的写入权限。
如果你使用的是Windows8:
- 点击开始button
- 在search框中,键入
command prompt
- 从结果中,右键单击
command prompt
,然后单击Run as administrator
。 然后执行keytool命令。
你可以给自己解决这个问题的权限。
右键单击cacerts>select属性>selectSecurit选项卡>允许所有组和用户名的所有权限。
这对我有效。
我甚至以pipe理员的身份运行命令提示符,但是对于下面的错误我没有用。
'keytool' is not recognized as an internal or external command, operable program or batch file.
如果keytool的path不在你的系统path中,那么你将需要使用完整的path来使用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
为我工作。
对于Mac用户,请确保sudo,并在出现提示时首先给予您的pipe理员密码,然后密钥库密码,通常应该是“changeit”,除非你真的改变它。
解决了
- 以pipe理员身份运行CMD。
- 确保使用正确的信任库密码
您可以存储其他磁盘或path(不是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