java - Glassfish v3 "unable to find valid certification path to requested target"

标签 java glassfish ssl-certificate keytool solaris-10

我意识到这个问题可能看起来是重复的,但我浏览过的线程似乎都没有解决或帮助我的情况。

几天来,我一直在尝试创建自签名 SSL 证书。需要该证书才能访问必须通过 HTTPS 提供 WSDL 文件的 glassfish 域。我在 Solaris 10 上使用 Glassfish 3.1.1,它不使用默认的 SSL 端口 (443)。目前,它正在使用 8181。

SSL 证书对用于访问它们的主机名非常特别。证书需要跨多个网络区域有效;因此 glassfish 域具有多个与之关联的不同 IP。据我所知,主机名(我们称之为 foobar)在服务器本身之外是不可访问的。

经过大量研究后,我决定我需要生成一个自签名证书,其中包含指示这些 IP 的主题备用名称。以下是我采取的步骤。

  • 使用 SAN 生成证书的最简单方法是下载 Java 7,其中包括具有此功能的 keytool 实用程序。从 Oracle 网站下载 JDK 1.7.0_04 并安装在 foobar 中。
  • 导航到 glassfish domain1 配置目录,例如
    /opt/glassfish3/glassfish/domains/domain1/config

  • (以下内容根据 Oracle Glassfish 3.1 文档修改:http://docs.oracle.com/cd/E18930_01/html/821-2435/ablqz.html)
  • 在 keystore 中生成证书。注意:每个 glassfish 域都有自己的 keystore ;下面的证书是为 domain1 生成的,它与 HTTPS 端口 8181 相关联。
    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
  • 将生成的证书导出到文件(在本例中为 foobar.cer)
    keytool -export -alias foobar -storepass changeit -file foobar.cer -keystore keystore.jks
  • 将证书作为可信证书导入 cacerts。执行此操作两次,一次用于 Glassfish cacerts 文件,一次用于 foobar 上的 Java JRE cacerts 文件。
    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
  • 以防万一,我还下载了证书并将其导入到将访问 HTTPS 的 Windows 工作站上的 Java JRE cacerts 文件中(可能没有必要)。

    在 C:\Program Files\Java\jre\lib\security 中:keytool -import -v -trustcacerts -alias foobar -file foobar.cer -keypass changeit -storepass changeit -keystore cacerts
  • 重新启动 glassfish domain1。
    asadmin restart-domain domain1
  • 重启完成后,测试连接。在我的情况下,我去我的 Windows 工作站,在那里我在 Netbeans 中加载了 Java 应用程序。我通过 HTTPS 在需要 WSDL 的地方运行测试,然后输入 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/

    相关文章:

    java - Java Bean 的一个好的用例是什么?

    java - ANTLR Ubuntu Java Makefile

    java - EclipseLink ValidationException - 非实体 [class long] 作为关系属性 [fieldproviderId] 中的目标实体

    web-services - 我可以获得中间证书来为我自己的域签署 SSL 证书吗?

    spring-boot - 如何在使用带有自签名证书的 Spring RestTemplate 时修复 "SSLHandshakeException"

    java - 如何使用具有多个其他依赖项(服务和存储库)的模拟存储库来测试服务?

    java - 在 JDBC 中获取列名

    java - EJB 定时器和可靠性

    java - Glassfish 在哪里将类加载器委托(delegate)选项设置为 false

    java - 使用带有自签名证书的 Elasticsearch Java REST API