java - 创建 Web 服务客户端时,没有主题备用名称出现异常

标签 java ssl ssl-certificate apache-axis wsdl2java

我想使用 wsdl2java 实用程序创建一个 Web 服务客户端。 我必须通过 SSL 连接到该服务器

这个 wsdl 看起来像这样:

https://xxx.xx.xx.xx:8443/api/wsdl/xxxxxxx.wsdl

我使用以下方法生成了证书:

openssl s_client -connect xxx.xx.xx.x:8443 </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > abcCertificate.pem

并将其添加到 keystore 中:

keytool -import -noprompt -trustcacerts -alias testcert -file abcCertificate.pem -keystore /usr/java/jdk1.7.0_06/jre/lib/security/cacerts -ext san=ip:xxx.xx.xx.xx

当我尝试使用 wsdl2java 创建Web 服务客户端时,它抛出异常:

javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present

我使用这些信息 from this link .

最佳答案

您似乎对“导入”和“生成”证书感到困惑。

openssl s_client 命令不会生成证书,它会检索该服务器上正在使用的证书。

您随后使用的 keytool -import 命令将该证书按原样导入到您的信任库中。在那里使用 -ext san=ip:xxx.xx.xx.xx 是没有意义的:您没有生成证书,您只是导入它。

如果您控制该服务器,则应该使用 IP 地址 SAN 生成(或从其他地方获取证书)(自 Java follows the specification strictly on this 起)。

如果您无法控制该服务器,请使用其主机名(前提是现有证书中至少有一个与该主机名匹配的 CN)。

一般来说,直接将仅从此类服务器获取的证书导入到您的信任存储中并不是很好,因为您假设该特定连接没有被篡改。

关于java - 创建 Web 服务客户端时,没有主题备用名称出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12792586/

相关文章:

Perl Webservice SSL 协商失败

c# - 如何根据证书对用户进行身份验证?

java - 用 Optional.ofNullable(...).ifPresent(...) 替换 get/test/set of bare references?

ios - SSL 固定和证书验证之间的区别

node.js - "Client network socket disconnected before secure TLS connection was established", Node 10

ssl - SSL通信的详细内容

ssl - 将客户端ssl cert变量设置为openresty中消息的请求头

java - 可以使用Lightcouch通过过滤器查询文档吗?

Java代码——寻找源代码

java - RXJava 获取在错误处理程序中导致异常的对象