0

我正在尝试使用来自 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://xxxx:8181/services/SomeService?wsdl,因为 1) 找不到文档;/2) 文件无法读取;3) 文档的根元素不是 .

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

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

    Failed to parse the WSDL.

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

4

1 回答 1

1

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

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

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

于 2013-01-22T12:03:34.753 回答