我想使用 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/