我们使用 wso2 esb(版本 4.0.3)来公开我们的 web 服务。我们的 web 服务是使用 wso2 中的管理控制台添加为代理服务的。我们只想通过 https 公开/使用我们的 web 服务。生成存根后,我们完成了以下操作
- 使用 java keytool 创建一个 jks 文件。
- 导出 wso2 证书并导入到 jks 文件中。
- 在调用 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;
}});
但这可能会产生安全问题。请建议我们如何解决此问题。