我想使用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
并使用以下命令将其添加到密钥库:
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
答案 0 :(得分:2)
您似乎在“导入”和“生成”证书之间感到困惑。
您openssl s_client
命令不会生成证书,它会检索该服务器上正在使用的证书。
之后使用的keytool -import
命令将该证书按原样导入您的信任库。在那里使用-ext san=ip:xxx.xx.xx.xx
是没有意义的:你没有生成证书,你只是导入它。
如果您控制该服务器,则应使用IP地址SAN生成(或从其他地方获取证书)(自Java follows the specification strictly on this起)。
如果您无法控制该服务器,请使用其主机名(前提是在现有证书中至少有一个与该主机名匹配的CN)。
一般情况下,直接将从这样的服务器获得的证书直接导入您的信任存储区并不是很好,因为您假设该特定连接未被篡改。