我正在尝试通过 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>
最后,当我检查密钥库时,未添加 SSL 证书,并且我的应用程序给出了与我之前尝试连接时遇到的相同异常:
(javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException)
如果您没有在管理员模式下运行命令提示符,则可能会发生这种情况。 如果您使用的是 Windows 7,您可以转到“运行”,输入 cmd,然后按 Ctrl+Shift+Enter。这将以管理员模式打开命令提示符。如果没有,您也可以转到开始->所有程序->附件->右键单击命令提示符,然后单击“以管理员身份运行”。
我在本地密钥库中导入证书时遇到了同样的问题。每当我发出 keytool 命令时,我都会收到以下错误。
Certificate was added to keystore
keytool error: java.io.FileNotFoundException: C:\Program Files\Java\jdk1.8.0_151\jre\lib\security (Access is denied)
以下解决方案对我有用。
确保您在以管理员身份运行模式下运行命令提示符
将当前目录更改为
%JAVA_HOME%\jre\lib\security
然后发出以下命令
keytool -import -alias "mycertificatedemo" -file "C:\Users\name\Downloads\abc.crt" -keystore cacerts
输入密码
changeit
输入
y
您将看到以下成功消息
"Certificate was added to keystore"
确保仅在 -keystore 参数值中提供
cacerts
,因为我提供了像 C:\Program Files\Java\jdk1.8.0_151\jre\lib\security
这样的完整路径。
希望这会起作用
我在Windows下遇到了同样的问题,可以通过以管理员身份运行cmd.exe来解决它(在开始菜单中右键单击,然后“以管理员身份运行”)。
检查密钥库的写入权限。
对于 Mac 用户,请确保使用 sudo,并在提示时首先提供您的管理员密码,然后是密钥库密码,该密码通常应为“changeit”,除非您实际更改了它。
如果您使用的是Windows8:
command prompt
command prompt
,然后单击 Run as administrator
。然后执行keytool命令。即使我以管理员身份运行cmd,我也遇到了这个错误。
根本原因是:该文件来自VCS(subversion、perforce等),当我检查该文件的属性时,它的属性是只读。
所以解决办法是:
要解决此问题,您必须以管理员身份访问或授予用户权限的完全控制权。它解决了我的问题。
您可以授予自己解决此问题的权限。
右键单击 cacerts > 选择属性 > 选择安全选项卡 > 允许所有组和用户名的所有权限。
这对我有用。
我什至以管理员身份运行命令提示符,但它对我不起作用,并出现以下错误。
'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
这对我有用。
确保您以管理员身份运行。 在 Mac 终端中:-
对于 Mac 使用以下命令
sudo keytool -importcert -file ~/certificate-file.cer -keystore $(/usr/libexec/java_home)/lib/security/cacerts
下面将为您提供cacerts的位置。
/usr/libexec/java_home
我们的密钥库存储在SCM中,由于某种原因再次直接从SCM服务下载文件,启用了修改密钥库。 可能之前下载的文件没有以二进制格式提供。
已解决