在默认WSo2证书中用作公用名的“Localhost”创建了无主题备用名称

我们使用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:不存在主题备用名称.
出现此错误的原因是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证书.

点赞