2012-04-25 472 views
82

我试图通过HTTPS连接Java Web API;然而,一个异常被抛出:导入证书后发生Java Keytool错误,“keytool错误:java.io.FileNotFoundException&拒绝访问”

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

我按照这些步骤是我从网上密钥工具& SSL证书教程了解到:

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

  2. 导出的证书的路径我的电脑上,为.cer

  3. 使用的密钥工具的导入选项被保存证书。下面的命令执行时没有任何错误。

  4. 我被提示在命令提示密码,这些我进入然后我认证。

  5. cmd窗口打印一些证书数据&签名和我提示一个问题:

    Trust this certificate?

    我肯定地回答。

  6. 的命令提示符显示

    Certificate was added to keystore

    不过该消息后,显示的另一个异常:

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

最后,当我检查了密钥库,不加入SSL证书和我的应用程序给出了我在尝试连接时遇到的相同例外情况:

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

你可以发布你已经执行的确切'keytool'命令,它的输出?这里有一些明显的问题是'-keystore'参数的输入错误,以及keytool无法找到将密钥导入到 – Alex 2012-04-25 18:39:19

+0

中的事实,我想写:keytool -import -alias downloadedCertAlias -keystore C:\ path \ to \ my \ keystore \ cacerts.file -file C:\ path \ of \ exportedCert.cer我也提到了执行没有错误的命令,所以显然这只是拼写错误在我的问题!无论如何感谢 – cyber101 2012-04-26 01:02:47

回答

179

如果您未以管理员模式运行命令提示符,可能会发生这种情况。 如果您使用的是Windows7,则可以运行,输入cmd并按Ctrl + Shift + Enter。这将以管理员模式打开命令提示符。如果没有,你也可以开始 - >所有程序 - >附件 - >右键单击命令提示符并说作为管理员运行。

+3

谢谢!右键单击运行 - 为我工作! – 2013-05-20 15:13:32

+6

对于Mac用户,一个简单的sudo将解决这个问题。作为管理员运行的 – 2014-05-26 17:14:43

+10

不是正确的解决方案。大多数公司都在锁定管理员权限。更好地解决为什么访问被拒绝而不是提升预防措施的原因。 – skword 2015-01-21 12:34:45

16

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

+0

请检查这是正确的答案! – HDave 2012-11-05 15:33:24

9

检查密钥库的写入权限。

+0

这一个为我工作! – 2014-06-27 10:55:22

+1

如果任何人都可以对此进行扩展,只是检查权限不会改变任何内容。 – user3071284 2017-04-05 14:36:54

+0

设置tomcat目录为只读将导致此异常 – svarog 2017-11-18 20:25:30

0

如果您正在使用Windows8的:

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

你可以给自己解决这个问题的权限。

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

这对我有效。

-2

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

0

我甚至运行命令提示符以管理员身份,但它并没有为我用下面的工作错误。

'keytool' is not recognized as an internal or external command, 
operable program or batch file. 

如果路径密钥工具是不是在你的系统路径,那么你将需要使用的完整路径使用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用户,请确保sudo,并在出现提示时首先给予您的管理员密码,然后密钥存储器密码通常应该是“changeit”,除非您实际上已更改密码。

+0

准时,我的朋友! – Chisko 2017-06-21 21:54:27

+0

与unix用户相同;) – JanDotNet 2017-12-31 09:44:23

-1

解决

  1. 只要运行CMD为管理员。
  2. 确保你使用了正确的信任库口令
0

我有同样的问题,而进口在本地密钥库证书。每当我发出keytool命令,我得到以下错误。

加入到证书密钥库 的keytool错误:java.io.FileNotFoundException:C:\ Program Files文件\的Java \ jdk1.8.0_151 \ JRE \ lib \ security中(访问被拒绝)

以下解决方案工作我。

1)请确保您以管理员模式

2)改变当前目录%JAVA_HOME%\ JRE \ lib \ security中

3)然后发出以下命令运行命令提示符罗斯

keytool -import -alias“mycertificatedemo”-file“C:\ Users \ name \ Downloads \ abc。CRT” -keystore cacerts中

3)授予密码的changeit

4)输入y

5)你会看到成功 以下信息: “加入到证书密钥库”

制作当然,我给出的完整路径如“C **:\ Program Files \ Java \ jdk1.8.0_151 \ jre \ lib \ security **”只能在-keystore参数值中给出“cacerts”。

希望这会起作用