4

我们使用 wso2 esb(版本 4.0.3)来公开我们的 web 服务。我们的 web 服务是使用 wso2 中的管理控制台添加为代理服务的。我们只想通过 https 公开/使用我们的 web 服务。生成存根后,我们完成了以下操作

  1. 使用 java keytool 创建一个 jks 文件。
  2. 导出 wso2 证书并导入到 jks 文件中。
  3. 在调用 web 服务时在代码中添加了以下内容。

System.setProperty("javax.net.ssl.trustStore", "filename"); System.setProperty("javax.net.ssl.trustStorePassword", "password");

当我们尝试从 java 代码调用 web 服务时做了所有这些之后,它只在 url 与 localhost 一起提供时才有效。它不适用于 127.0.0.1 或机器 IP 地址,即使我们在主机文件中有正确的映射。使用 ip 地址时,我们得到的错误为 javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present. 出现此错误是因为 wso2 提供的默认证书将“localhost”作为公用名。我们可以通过添加以下代码来摆脱这个问题

 HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
          public boolean verify(String string, SSLSession ssls) {
                          return true;
          }});

但这可能会产生安全问题。请建议我们如何解决此问题。

4

1 回答 1

2

当主机名与证书的 CN 不匹配时,会出现此错误。我可以为您提供两种解决方案。

  • 如果您只需要使用 IP 地址访问服务,则只需生成具有正确 IP 地址的证书作为服务器证书的 CN 值的值。可以使用 Java Keytool。
  • 如果要同时使用 IP 地址和主机名来寻址服务,请生成包含主题备用名称 (SAN) 的证书。Java 7 附带的 Java Keytool 能够使用 SAN 生成证书。否则,请使用任何其他工具,例如 OpenSSL 或使用由 SAN 颁发的 CA 证书。
于 2012-06-22T12:21:57.690 回答