0

当远程服务器证书有问题并且证书 CN 与域名不匹配时,会定期出现问题,我无法影响这一点。为了解决这个问题,有一个解决方案 - 创建和设置虚拟主机名验证器(示例中的 scala 语法):

val hv = new HostnameVerifier() {
  def verify(s: String, sslSession: SSLSession) = true
}

如果我可以访问真实连接,我可以为每个连接设置此验证器:

https_connection.setHostnameVerifier(hv)

但是如果我不能直接控制连接,比如使用 wsimport 生成的 SOAP 包装器,我会这样做:

HttpsURLConnection.setDefaultHostnameVerifier(hv)

并将其设置为上课。

问题:如果我有使用与 HTTPS 连接的类的 tomcat webapp,其中一个使用静态方法设置默认验证程序,那么此更改影响的范围是什么?

替代问题:如何在 wsimport 生成的 SOAP Web 服务中设置主机名验证器?

4

1 回答 1

0

问题可能有点不专业,但我花了一些时间来掌握,也许会节省别人的时间。

问题:如果我有使用与 HTTPS 连接的类的 tomcat webapp,其中一个使用静态方法设置默认验证程序,那么此更改影响的范围是什么?

我做了一个小测试,在一个简单的 servlet 中,我在一个请求中设置,HttpsURLConnection.setDefaultHostnameVerifier(hv)并在 subsequestgetHostnameVerifier中从新的 HttpsURLConnection 对象中读取。当然和我在第一个请求中设置的一样,怎么可能是其他方式。所以scope至少是tomcat webapp的范围。


替代问题:如何在 wsimport 生成的 SOAP Web 服务中设置主机名验证器?

使用JAXWSProperties.HOSTNAME_VERIFIER

val ws = (new MyJAXWSWebService()).getMyJAXWSWebServiceSoap
val context = ws.asInstanceOf[BindingProvider].getRequestContext

// their certificate doesn't match domain!
context.put(JAXWSProperties.HOSTNAME_VERIFIER, new HostnameVerifier() {
  def verify(s: String, sslSession: SSLSession) = true
})
于 2013-06-19T15:31:14.393 回答