我们使用 wso2 esb(版本 4.0.3)来公开我们的 Web 服务。我们的 Web 服务是使用 wso2 中的管理控制台添加为代理服务的。我们只想通过 https 公开/使用我们的 Web 服务。生成存根后,我们完成了以下操作
- 使用 java keytool 创建 jks 文件。
- 导出 wso2 证书并导入到 jks 文件中。
- 在调用Web服务时在代码中添加以下内容。
System.setProperty("javax.net.ssl.trustStore", "文件名");
System.setProperty("javax.net.ssl.trustStorePassword", "密码");
完成所有这些之后,当我们尝试从 java 代码调用 Web 服务时,它仅在使用 localhost 给出 url 时才有效。即使我们在主机文件中具有正确的映射,它也不适用于 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;
}});
但这可能会产生安全问题。请建议我们如何解决这个问题。
当主机名与证书的 CN 不匹配时,会出现此错误。我可以为您提供两种解决方案。
- 如果您只需要使用 IP 地址访问服务,则只需生成一个证书,将正确的 IP 地址作为服务器证书的 CN 值。可以使用Java Keytool。
- 如果要使用 IP 地址和主机名来寻址服务,请生成包含主题备用名称 (SAN) 的证书。 Java 7 附带的 Java Keytool 能够使用 SAN 生成证书。否则,请使用任何其他工具(例如 OpenSSL)或使用由 CA 与 SAN 颁发的证书。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)