cxf客户端中的SNI配置(3.1.2)

时间:2018-09-10 06:27:32

标签: java rest jax-rs cxf

我想在使用CXF客户端(3.1.2)进行剩余调用时设置自定义SNI主机名(SNI配置)。我使用的是Java8。我可以使用HTTPClient执行相同的操作(请参见下面的强文本代码以供参考),但是我无法弄清楚如何使用CXF客户端执行相同的操作。

//对于HTTP客户端

 private SSLConnectionSocketFactory createSSLConnectionSocketFactory(String sniHostanme,
        SSLContext sslContext){

    // Fix for host name verifier, need to implement----------------------
    SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, new String[] { "TLSv1.2" }, null,
            SSLConnectionSocketFactory.getDefaultHostnameVerifier()) {
        @Override
        protected void prepareSocket(SSLSocket socket) throws IOException {
            try {
        //      System.out.println("************ setting socket HOST property *************");

                // If SNI is required
                if (StringUtils.isNotBlank(sniHostanme)) {
                    log.debug("SNI HOSTNAME = "+sniHostanme);

                    List<SNIServerName> sniServerNames = new ArrayList<>();
                    sniServerNames.add(new SNIHostName(sniHostanme));

                    SSLParameters sslParam = new SSLParameters();
                    sslParam.setServerNames(sniServerNames);
                    socket.setSSLParameters(sslParam);
                }
                // PropertyUtils.setProperty(socket, "host", "ws.mastercard.com");
            } catch (Exception ex) {
                log.error(ex.getMessage());
            }
            // super.prepareSocket(socket);
        }

    };
    return sslsf;
}

1 个答案:

答案 0 :(得分:0)

使用org.apache.cxf.configuration.jsse.TLSClientParameters类和公共最终void setCertAlias(String ctAlias)方法来设置服务器端使用的证书别名,这在密钥库具有多个证书时非常有用。希望这将对您有所帮助。