【问题标题】:CXF RESTful Client - How to do trust all certs?CXF RESTful 客户端 - 如何信任所有证书?
【发布时间】:2011-10-24 19:50:06
【问题描述】:

我编写了 Jersey RESTful 客户端,它们使用 Dumb X509TrustManager 和 HostnameVerifier 来信任我们实验室系统上的所有 SSL 证书,以便更轻松地处理自签名证书。

        ClientConfig config = new DefaultClientConfig();
        SSLContext context = null;
        try
        {
            context = SSLContext.getInstance("SSL");
            context.init(null,
                    new TrustManager[] { new DumbX509TrustManager() },
                    null);
            config.getProperties()
                    .put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES,
                            new HTTPSProperties(this.getHostnameVerifier(),
                                    context));
            webClient = Client.create(config);
        }
        ....

有没有办法让我使用 CXF 做类似的事情?

【问题讨论】:

    标签: java client ssl-certificate cxf


    【解决方案1】:

    这是来自 CXF 邮件列表。请注意,由于其他系统更新,我不必实现它,所以这是理论上的:

    WebClient webClient = WebClient.create(this.serviceURL,
        this.username,
        this.password,
        null); // Spring config file - we don't use this
    
    if (trustAllCerts)
    {
        HTTPConduit conduit = WebClient.getConfig(webClient)
            .getHttpConduit();
    
        TLSClientParameters params = 
            conduit.getTlsClientParameters();
    
        if (params == null) 
        {
            params = new TLSClientParameters();
            conduit.setTlsClientParameters(params);
        }
    
        params.setTrustManagers(new TrustManager[] { new
            DumbX509TrustManager() }); 
    
        params.setDisableCNCheck(true);
    }
    

    【讨论】:

    • This answer 详细说明了如何设置一个盲目接受证书的虚拟 TrustManager。 (当然,你可能不想在生产中使用类似的东西)
    【解决方案2】:

    为了完成来自 sdoca 的回答,这里有一个带有哑 X509 信任管理器的实现:

    import org.apache.cxf.configuration.jsse.TLSClientParameters;
    import org.apache.cxf.jaxrs.client.WebClient;
    import org.apache.cxf.transport.http.HTTPConduit;
    [...]
    
    public class ApiClient {
    
        private WebClient webClient;
        [...]
    
        public void init() {
    
            webClient = createWebClient(URI).accept(MediaType.APPLICATION_JSON).type(MediaType.APPLICATION_JSON);
            addX509TrustManager();
        }
    
        private void addX509TrustManager() {
            Assert.notNull(webClient, "Client needs to be initialized");
            HTTPConduit conduit = WebClient.getConfig(webClient).getHttpConduit();
            TLSClientParameters params = conduit.getTlsClientParameters();
    
            if (params == null) {
                params = new TLSClientParameters();
                conduit.setTlsClientParameters(params);
            }
    
            params.setTrustManagers(new TrustManager[] { new BlindTrustManager() });
            params.setDisableCNCheck(true);
        }
    
    }
    

    其中 BlindTrustManager 定义如下:

    import java.security.cert.X509Certificate;
    import javax.net.ssl.X509TrustManager;
    
    /**
     * This dumb X509TrustManager trusts all certificate. TThis SHOULD NOT be used in Production. 
     */
    public class BlindTrustManager implements X509TrustManager {
    
        @Override
        public void checkClientTrusted(X509Certificate[] chain,
                String authType) throws java.security.cert.CertificateException {
        }
    
        @Override
        public void checkServerTrusted(X509Certificate[] chain,
                String authType) throws java.security.cert.CertificateException {
        }
    
        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
    }
    

    检查此链接以更好地理解可能很有用:

    【讨论】:

      猜你喜欢
      • 2014-02-14
      • 1970-01-01
      • 2018-03-18
      • 2012-11-03
      • 1970-01-01
      • 2020-10-29
      • 2010-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多