java - wsimport from https : [ERROR] java. security.cert.CertificateException:不存在主题备用名称

标签 java web-services soap https wsimport

我正在尝试使用 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/

相关文章:

java - 为什么列表优于队列?

java - 实现接口(interface)的类也是接口(interface)吗?

java - 制作二十一点程序,从方法返回数组时遇到问题

xml - 解码错误 : unexpected element (uri :"", 本地 :"user")。预期元素是(无)

api - Magento : get shopping cart list

Phpunit,模拟 SoapClient 是有问题的(模拟魔术方法)

java - schema.org 在 Java 中反序列化

ios - 在没有互联网时防止 JSONSerialization 崩溃我的应用程序的最佳方法?

java - 在java mysql中同时处理多个请求

c# - 签署外发消息