【问题标题】:wsimport from https: [ERROR] java.security.cert.CertificateException: No subject alternative names present来自 https 的 wsimport:[错误] java.security.cert.CertificateException:不存在主题替代名称
【发布时间】:2013-01-22 10:47:54
【问题描述】:

我正在尝试使用来自 https wsdl 的 wsimport 生成 Web 服务客户端:

call wsimport -d bin -s src -p mypackage.ws https://x.x.x.x:8181/services/SomeService?wsdl

为了解决安全错误,我在 Java 的密钥库中添加了一个服务器证书:

keytool -import -keystore c:\Java\jdk1.6.0_38\jre\lib\security\cacerts -file c:\ca-dev.crt

但是当我执行 wsimport 时出现错误:

[错误] java.security.cert.CertificateException:不存在主题替代名称

读取WSDL文档失败:https://x.x.x.x:8181/services/SomeService?wsdl,因为1)找不到文档; /2) 文件不能 被阅读; 3)文档的根元素不是。

[ERROR] failed.noservice=在提供的 WSDL 中找不到 wsdl:service:

需要提供至少一个具有至少一个服务定义的 WSDL

    Failed to parse the WSDL.

已解决! 在 hosts 文件中添加了名称与证书 CN 相同的条目。

【问题讨论】:

  • 在 hosts 文件中添加了与证书 CN 同名的条目。

标签: java web-services soap https wsimport


【解决方案1】:

SSL 证书基于主机名。证书的 CN 必须是您尝试访问的主机名,或者它必须有一个可选的主题备用名称条目,该条目与您尝试访问的主机名完全匹配。

如果可能,请确保您的 https URL 中的主机名与证书中的 CN 或主题备用名称之一完全匹配。许多证书没有主题备用名称,因此如果您在检查证书时找不到任何名称,请不要强调。

有时以这种方式引用主机名是不可能的,例如当端口 8181 只能在 LAN 内访问时,如果通过完整且正确的主机名引用机器,则将使用 Internet 路由来访问它。据我所知,没有禁用证书检查的命令行方法。一种(显然是不可移植的)解决方法是向您的 hosts 文件添加一个条目,该文件通常位于 Windows 中的 %SystemRoot%\system32\drivers\etc\hosts,因此您可以使用证书中的主机名来引用服务器。

【讨论】:

  • 导入证书时它要求输入密码,我不能要求第三方输入密码。请协助我。
  • 我已将 Web 服务器的 IP 地址添加到 hosts 文件并将其映射到 CN 到证书,并将 WSDL url 更改为具有 IP 地址而不是服务器名称。现在,我收到“No Subject Alternative Names”错误。我该如何解决这个问题。
  • WSDL URL 需要使用与证书的 CN 完全匹配的主机名。
  • 证书的 CN 中有空格(例如 CN=ABC Inc)。在主机文件中,我已将 ip 映射到此 CN 并将 CN 包含在 "" (x.x.x.x "ABC Inc") 中。问题是我不能在 WSDL 的 URL 中使用带有空格的 CN 从服务器访问 WSDL。 wsimport "ABC Inc/ABCService?wsdl"
  • 最后一行应该是 wsimport '"ABC Inc/ABCService?wsdl"'。 URL 中缺少 https://。我希望你能明白。
猜你喜欢
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 2020-08-12
  • 2020-07-08
  • 2015-09-16
  • 2014-04-25
  • 2023-04-11
  • 2019-05-09
相关资源
最近更新 更多