我正在尝试使用 https wsdl 中的 wsimport 生成 Web 服务客户端:
call wsimport -d bin -s src -p mypackage.ws https://x.x.x.x:8181/services/SomeService?wsdl
为了解决安全错误,我将服务器的证书添加到 Java 的 keystore 中:
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) 文档的根元素不是 .
[错误] failed.noservice=在提供的 WSDL 中找不到 wsdl:service:
需要提供至少一个包含至少一个服务定义的 WSDL。
Failed to parse the WSDL.
已解决! 在主机文件中添加了与证书 CN 名称相同的条目。
最佳答案
SSL 证书基于主机名。证书的 CN 必须是您尝试访问的主机名,或者它必须具有与您尝试访问的主机名完全匹配的可选主题备用名称条目。
如果可能,请确保 https URL 中的主机名与证书中的 CN 或主题备用名称之一完全匹配。许多证书没有主题备用名称,因此,如果您在检查证书时找不到任何主题备用名称,请不要担心。
有时以这种方式引用主机名是不可能的,例如当端口 8181 只能在 LAN 内部访问时,通过完整且正确的主机名引用计算机将使用 Internet 路由来到达它。据我所知,没有命令行方法可以禁用证书检查。一种(显然不可移植)解决方法是向 hosts
文件添加一个条目,该文件通常位于 Windows 中的 %SystemRoot%\system32\drivers\etc\hosts
,因此您可以使用证书中的主机名来引用服务器。
关于java - wsimport from https : [ERROR] java. security.cert.CertificateException:不存在主题备用名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14456789/