使用CXF通过代理进行https调用期间出错

时间:2019-04-11 16:02:14

标签: proxy cxf http-conduit

在camel-cxf中,我必须通过代理调用SOAP Web服务(在https中公开):按如下方式配置http管道

public void configureClient(Client client) {

        String proxySrv = Util.getProperty(Constants.Config.PROXY_SRV);
        int proxyPort = new Integer(Util.getProperty(Constants.Config.PROXY_PORT));
        log.info("Configurazione del server proxy:'"+proxySrv+"' port:'"+proxyPort+"'");
        HTTPConduit conduit = (HTTPConduit) client.getConduit();
        HTTPClientPolicy policy = new HTTPClientPolicy();
        policy.setProxyServer(proxySrv); // set proxy host
        policy.setProxyServerPort(proxyPort); // set proxy port
        policy.setProxyServerType(ProxyServerType.SOCKS);
        conduit.setClient(policy);
        conduit.setAuthSupplier(new DefaultBasicAuthSupplier());
        boolean proxyAuthEnabled = new Boolean(Util.getProperty(Constants.Config.PROXY_AUTH_EN));
        String user = Util.getProperty(Constants.Config.PROXY_USER);
        String pass = Util.getProperty(Constants.Config.PROXY_PASS);
        log.info("Recuperati username:'+"+user+"' e password per il proxy:'"+proxySrv+"' port:'"+proxyPort+"'");
        if (proxyAuthEnabled) {
            ProxyAuthorizationPolicy ap =  new ProxyAuthorizationPolicy();
            ap.setUserName(user);
            ap.setPassword(pass);
            conduit.setProxyAuthorization(ap);
//          conduit.getAuthorization().setUserName(user);
//          conduit.getAuthorization().setPassword(pass);
            log.info("Autenticazione abilitata per userName ='"+user+"' per il proxy:'"+proxySrv+"' port:'"+proxyPort+"'");

        }

它适用于http呼叫(未设置代理服务器类型),但不适用于https呼叫。此代理需要基本身份验证。

阅读各种文章,我发现CXF中存在一个错误,该错误不会在CONNECT调用中发送标题授权(实际上,我需要407授权->即使使用与HTTP调用相同的凭据也可以) )。

有没有办法解决?我了解了奥利维尔·比拉德(Olivier Billard)解决方案

https://www.mail-archive.com/users@cxf.apache.org/msg06422.html

但是我并没有理解该解决方案(而且我无法在代码中导入任何密钥库)。

谢谢

1 个答案:

答案 0 :(得分:0)

您好,我刚遇到apache cxf客户端的问题,邮件列表中建议的解决方法是使用(?<=\bREF) # positive lookbehind, make sure we have REF before (?!:) # negative lookahead, make sure we haven't colon after 类的以下静态方法:

java.net.Authenticator

这样,将在所有使用代理的Authenticator.setDefault(new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("youruser", "yourpassword".toCharArray()); } }); 上自动设置基本身份验证,因为Java 8还必须启用HTTPS隧道的基本身份验证,因此可以使用以下属性进行此操作:

HttpUrlConnection

我希望这对您有帮助