165

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

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

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

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

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

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

    keytool -import -alias downloadedCertAlias -keystore C:\path\to\my\keystore\cacerts.file -file C:\path\of\exportedCert.cer
    
  4. 在命令提示符处提示我输入密码,然后我输入了密码,然后通过了身份验证。

  5. cmd窗口打印了一些证书数据和签名,并提示我以下问题:

    相信这个证书?

    我回答是的。

  6. 显示的cmd提示符

    证书已添加到密钥库

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

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

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

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

12 回答 12

315

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

于 2012-07-05T17:58:35.963 回答
35

在本地密钥库中导入证书时我遇到了同样的问题。每当我发出 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)给密码changeit

4) 输入 y

5) 您将在成功的“证书已添加到密钥库”中看到以下消息

确保仅在 -keystore 参数值中提供“ cacerts ”,因为我提供了完整路径,例如“C**:\Program Files\Java\jdk1.8.0_151\jre\lib\security**”。

希望这会奏效

于 2017-12-06T08:07:33.950 回答
24

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

于 2012-05-03T09:07:06.417 回答
13

检查密钥库的写入权限。

于 2012-06-27T16:51:21.483 回答
7

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

于 2017-06-21T19:17:10.973 回答
2

如果您使用的是 windows8:

  1. 点击开始按钮
  2. 在搜索框中,键入command prompt
  3. 从结果中,右键单击command prompt并单击Run as administrator。然后执行keytool命令。
于 2016-03-17T06:16:02.197 回答
2

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

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

这对我有用。

于 2016-05-31T22:34:37.500 回答
1

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

根本原因是:该文件来自 VCS(subversion、perforce 等),当我检查该文件的属性时,它的 Attributes 是Read-only

所以解决方案是:

  • (1) 禁用“只读”属性;
  • (2) 从VCS中签出,让文件处于读写状态。
于 2020-06-16T01:01:06.790 回答
0

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

'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

这对我有用。

于 2017-02-14T12:59:18.560 回答
0

确保您以管理员身份运行。在 Mac 终端中:-

  1. 运行 sudo -i
  2. 然后执行命令
于 2022-02-11T13:31:18.230 回答
-2

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

在此处输入图像描述

于 2016-10-13T13:48:14.357 回答
-2

解决了

  1. 只需以管理员身份运行 CMD。
  2. 确保您使用正确的信任库密码
于 2017-09-13T07:32:24.397 回答