how to make Unirest(java) ignore certificate error

后端 未结 5 1796
无人及你
无人及你 2021-02-04 07:42

I am using Unirest (java version) to make GET and POST request.But I encounter a problem when accessing SSL encrypted site , since my program is behind a corporate network and t

相关标签:
5条回答
  • 2021-02-04 07:53
     SSLContext sslcontext = SSLContexts.custom()
                .loadTrustMaterial(null, new TrustSelfSignedStrategy())
                .build();
    
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext,SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
        CloseableHttpClient httpclient = HttpClients.custom()
                .setSSLSocketFactory(sslsf)
                .build();
        Unirest.setHttpClient(httpclient);
    

    this worked for me

    0 讨论(0)
  • 2021-02-04 08:00

    the certificate error solution is a combination from a few places

    • https://github.com/Mashape/unirest-java/issues/70, where i started.
    • http://literatejava.com/networks/ignore-ssl-certificate-errors-apache-httpclient-4-4/ very good explanation.
    • http://www.baeldung.com/httpclient-ssl, solution for all versions.

    and a relatively complete example.

    import java.security.KeyManagementException;
    import java.security.KeyStoreException;
    import java.security.NoSuchAlgorithmException;
    
    import javax.net.ssl.SSLContext;
    import javax.security.cert.CertificateException;
    import javax.security.cert.X509Certificate;
    
    import org.apache.http.client.HttpClient;
    import org.apache.http.conn.ssl.NoopHostnameVerifier;
    import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.ssl.SSLContextBuilder;
    
    import com.mashape.unirest.http.HttpResponse;
    import com.mashape.unirest.http.JsonNode;
    import com.mashape.unirest.http.Unirest;
    import com.mashape.unirest.http.exceptions.UnirestException;
    
    public class XXX {
    
        private static HttpClient unsafeHttpClient;
    
        static {
            try {
                SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy() {
                    public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                        return true;
                    }
                }).build();
    
                unsafeHttpClient = HttpClients.custom().setSSLContext(sslContext)
                        .setSSLHostnameVerifier(new NoopHostnameVerifier()).build();
    
            } catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException e) {
                e.printStackTrace();
            }
        }
    
        public static HttpClient getClient() {
            return unsafeHttpClient;
        }
    
        public static void main(String[] args) {
    
            try {
                HttpClient creepyClient = RestUnirestClient.getClient();
                Unirest.setHttpClient(creepyClient);
    
                HttpResponse<JsonNode> response = Unirest.get("https://httpbin.org/get?show_env=1").asJson();
                System.out.println(response.getBody().toString());
    
            } catch (UnirestException e) {
                e.printStackTrace();
            }
        }
    }
    
    0 讨论(0)
  • 2021-02-04 08:07

    I'm using "com.konghq:unirest-java:2.3.14“

    There is a config now

    Unirest.config().verifySsl(false);
    
    0 讨论(0)
  • 2021-02-04 08:08

    This is how I finally solved my problem:

    public static HttpClient makeClient(){
        SchemeRegistry schemeRegistry = new SchemeRegistry();
        schemeRegistry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));
        try {
            schemeRegistry.register(new Scheme("https", 443, new MockSSLSocketFactory()));
        } catch (KeyManagementException e) {
            e.printStackTrace();
        } catch (UnrecoverableKeyException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (KeyStoreException e) {
            e.printStackTrace();
        }
        ClientConnectionManager cm = new SingleClientConnManager(schemeRegistry);
        DefaultHttpClient httpclient = new DefaultHttpClient(cm);
        return httpclient;
    }
    

    I had been scratching for a whole day, I hope this could help someone.

    0 讨论(0)
  • 2021-02-04 08:20

    Unfortunately, Unirest does not have a native way to configure SSL, so providing a custom HttpClient instance looks like the only option. Here is a solution, which does not use deprecated classes (like 'DefaultHttpClient') and works with self-signed certificates:

    protected void prepareHttpsClient() {
        HttpClientBuilder clientBuilder = HttpClientBuilder.create();
        try {
            String certificateStorage = <<yourCertStorageFileName>>;
            String certificatePassword = <<yourCertStoragePassword>>;
            SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(
                new File(certificateStorage), certificatePassword.toCharArray(),
                new TrustSelfSignedStrategy()).build();
            SSLConnectionSocketFactory sslFactory = new SSLConnectionSocketFactory(sslContext,
                new String[]{"TLSv1"}, null,
                SSLConnectionSocketFactory.getDefaultHostnameVerifier());
            clientBuilder.setSSLSocketFactory(sslFactory);
        }
        catch (Exception e) {
            throw new IllegalArgumentException("Error configuring server certificates.", e);
        }
        HttpClient httpClient = clientBuilder.build();
        Unirest.setHttpClient(httpClient);
    }
    
    0 讨论(0)
提交回复
热议问题