0

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

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

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

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

  1. 使用 SAN 生成证书的最简单方法是下载 Java 7,其中包括具有此功能的 keytool 实用程序。从 Oracle 网站下载 JDK 1.7.0_04 并安装在 foobar 中。

  2. 导航到 glassfish domain1 配置目录,例如 /opt/glassfish3/glassfish/domains/domain1/config

(以下内容根据 Oracle Glassfish 3.1 文档修改: http: //docs.oracle.com/cd/E18930_01/html/821-2435/ablqz.html

  1. 在密钥库中生成证书。注意:每个 glassfish 域都有自己的密钥库;下面的证书是为 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

  2. 将生成的证书导出到文件(在本例中为 foobar.cer)

    keytool -export -alias foobar -storepass changeit -file foobar.cer -keystore keystore.jks

  3. 将证书作为可信证书导入 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

  4. 以防万一,我还下载了证书并将其导入到将访问 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

  5. 重新启动 glassfish domain1。

    asadmin restart-domain domain1

  6. 重启完成后,测试连接。在我的情况下,我去我的 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 组合生成自签名证书?

谢谢...帮助将不胜感激!

PS 如果需要,我可以提供应用程序代码。

4

2 回答 2

1

自从我遇到这个问题以来已经有一段时间了。

我无法如上所述解决它,所以我最终从公共 CA 订购了 SSL 证书。

关于 Glassfish (3.1.1) 和 SSL,我确实遇到了一个值得注意的怪癖。无论出于何种原因,每个域至少需要存在一个未启用 SSL 的网络侦听器,否则在访问启用 SSL 的 Web 服务 URL 时会出现证书错误。

所以说我在 8080 和 8181 上有一个监听器。如果两者都启用了 SSL,那么证书将不起作用。如果从 8080 中删除 SSL,则附加到侦听器 8181 的证书将起作用。

于 2012-10-03T22:44:22.243 回答
0

我认为问题在于 cacerts 的证书必须有一个非常具体的别名(在 3.1.1.2 中它是 glassfish-instance)

于 2013-02-08T17:06:32.130 回答