【发布时间】:2017-01-19 08:22:48
【问题描述】:
软件供应商向我提供了 SSL 证书(扩展名为 .cer)。当我在笔记本电脑上打开它时,我可以看到
此证书用于以下目的:
- 所有应用程序策略
发给:uat.xxxxxx.sg
发布者:XXXXXX。
在“Certification path”标签下,我可以链,上面有“XXXXXX”,下面有“uat.xxxxxx.sg”。下面的证书状态显示:
证书状态:
找不到此证书的颁发者。
我把这个证书复制到了一个服务器(姑且称它为服务器XYZ),在服务器上打开,它显示:
Windows 没有足够的信息来验证此证书:
发给:uat.xxxxxx.sg
发布者:XXXXXX。
在“证书路径”选项卡下,它只显示一个“uat.xxxxxx.sg”,
证书状态:
找不到此证书的颁发者。
为什么它在不同的机器上显示不同?
在我的笔记本电脑上,我将证书文件导入到 Java 密钥库文件中。这将是我的信任商店。然后我运行了一个我自己编写的小型 Java 程序,以使用单向 SSL 连接到软件供应商的服务器,并使用以下参数来指定信任库。该程序运行良好,因为它能够成功连接到软件供应商的服务器。
-Djavax.net.ssl.trustStore=....
-Djavax.net.ssl.trustStorePassword....
但是,当我将程序和密钥库带到服务器 XYZ 并运行它时,它“无法找到请求目标的有效证书路径”失败。似乎证书在服务器 XYZ 上变得未知,即使它在我的信任库中。
可能是什么问题?
提前致谢。
【问题讨论】:
-
您确定证书在您的信任中吗?您可以列出证书并进行检查。 keytool -list -v -keystore keystore.jks
-
一个 .cer 可以包括叶证书以及到已颁发证书的根 CA 的证书链。在您的情况下,似乎缺少链条。在您的笔记本电脑中,您可能已经安装了颁发者,然后当操作系统显示证书时,它会在系统信任库中找到颁发者并显示它。在您的服务器中可能没有安装颁发者证书。
-
是的,我确定它在我的信任库中。我确实将信任库文件 (.jks) 从我的笔记本电脑直接复制到服务器 XYZ。我在服务器 XYZ 上运行了您的命令,我可以看到列出的证书“uat.xxxxxx.sg”。我还使用 -Djavax.net.debug=all 运行了我的程序,并且可以在输出中看到我的证书。但是,在输出的末尾,我可以看到描述“certificate_unknown”。
-
在信任库中包含证书应该足以连接到 SSL 服务器。但通常的配置是包含根 CA,而不是叶证书。你能把它导入JKS吗?如果它不起作用,可能是服务器端配置错误
-
嗨 pedrofb,我在笔记本电脑上运行了“mmc”,可以在“受信任的根证书颁发机构”下看到颁发者“XXXXXX”。在服务器 XYZ 上,我在运行“mmc”时看不到发行者。这可能解释了为什么我的笔记本电脑和服务器 XYZ 上的证书链显示不同?
标签: java ssl https ssl-certificate keystore