我意识到这个问题可能看起来是重复的,但我浏览过的线程似乎都没有解决或帮助我的情况。
几天来,我一直在尝试创建自签名 SSL 证书。需要该证书才能访问必须通过 HTTPS 提供 WSDL 文件的 glassfish 域。我在 Solaris 10 上使用 Glassfish 3.1.1,它不使用默认的 SSL 端口 (443)。目前,它正在使用 8181。
SSL 证书对用于访问它们的主机名非常特别。证书需要跨多个网络区域有效;因此 glassfish 域具有多个与之关联的不同 IP。据我所知,主机名(我们称之为 foobar)在服务器本身之外是不可访问的。
经过大量研究后,我决定我需要生成一个自签名证书,其中包含指示这些 IP 的主题备用名称。以下是我采取的步骤。
/opt/glassfish3/glassfish/domains/domain1/config
(以下内容根据 Oracle Glassfish 3.1 文档修改:http://docs.oracle.com/cd/E18930_01/html/821-2435/ablqz.html)
keytool -genkey -alias foobar
-keyalg RSA
-dname "CN=foobar,
OU=xxxxxxx xxxx,
O=xxxxxxxxxx,
L=xxxxx xxx,
S=xx, C=xx"
-ext "SAN=IP:12.34.56.78,IP:99.88.77.66"
-keypass changeit -storepass changeit
-validity 3650
-keystore keystore.jks
keytool -export -alias foobar -storepass changeit
-file foobar.cer
-keystore keystore.jks
keytool -import -v -trustcacerts
-alias foobar
-file foobar.cer
-keypass changeit -storepass changeit
-keystore cacerts.jks
在/usr/java/jre/lib/security 中:
keytool -import -v -trustcacerts
-alias foobar
-file foobar.cer
-keypass changeit -storepass changeit
-keystore cacerts
在 C:\Program Files\Java\jre\lib\security 中:
keytool -import -v -trustcacerts -alias foobar -file foobar.cer -keypass changeit -storepass changeit -keystore cacerts
asadmin restart-domain domain1
https://12.34.56.78:8181
作为源。 这给了我以下错误:
2012-06-05 10:25:32,132 WARN utilities.ConnectionManager - Could not connect to url https://12.34.56.78:8181/foobar/WebService?wsdl: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
如果我改为使用域 1 的默认 Glassfish SSL 证书,则会收到一个错误,指示不存在主题备用名称。这就是为什么我首先遇到了重新生成证书的麻烦。
据我所知,将证书导入为受信任的 CA 证书应该可以解决此“无法找到有效的证书路径”错误。我承认我不是网络专家,但到目前为止我的所有研究都表明情况确实如此。我不确定这里的问题是否是因为我使用的是非标准 SSL 端口(必须添加 :8181 可能会导致与 SAN IP 不匹配)。我还没有尝试过。但是有没有办法在 CN 或 SAN 中为 IP:Port 组合生成自签名证书?
谢谢...帮助将不胜感激!
附言如有必要,我可以提供应用程序代码。
最佳答案
自从我遇到这个问题以来已经有一段时间了。
我无法如上所述解决它,所以我最终从公共(public) CA 订购了 SSL 证书。
关于 Glassfish (3.1.1) 和 SSL,我确实遇到了一个值得注意的怪癖。无论出于何种原因,每个域至少需要存在一个未启用 SSL 的网络监听器,否则在访问启用 SSL 的 Web 服务 URL 时会出现证书错误。
所以说我在 8080 和 8181 上有一个监听器。如果两者都启用了 SSL,那么证书将不起作用。如果从 8080 中删除 SSL,则附加到监听器 8181 的证书将起作用。
关于java - Glassfish v3 "unable to find valid certification path to requested target",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10903279/