2

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

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

4

1 回答 1

2

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

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

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

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

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

通常,将仅从这样的服务器获得的证书直接导入到您的信任库中并不是很好,因为您假设该特定连接没有被篡改。

于 2012-10-09T10:44:50.810 回答