创建Web服务客户端时,没有主题备用名称存在exception

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

这个wsdl看起来像这样:

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

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

 openssl s_client -connect xxx.xx.xx.x:8443  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服务客户端时,它会抛出exception

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

我使用此链接中的这些信息。

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

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

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

如果您控制该服务器,则应使用IP地址SAN生成(或从其他位置获取证书)(因为Java严格遵循此规范 )。

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

通常,将直接从这样的服务器获得的证书直接导入您的信任存储区并不是很好,因为您假设该特定连接未被篡改。