Java: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

前端 未结 23 1518
佛祖请我去吃肉
佛祖请我去吃肉 2020-11-22 04:44

I have a class that will download a file from a https server. When I run it, it returns a lot of errors. It seems that I have a problem with my certificate

23条回答
  •  暗喜
    暗喜 (楼主)
    2020-11-22 05:04

    I was able to get it working with code only, i.e. no need to use keytool:

    import com.netflix.config.DynamicBooleanProperty;
    import com.netflix.config.DynamicIntProperty;
    import com.netflix.config.DynamicPropertyFactory;
    import org.apache.http.client.config.RequestConfig;
    import org.apache.http.config.Registry;
    import org.apache.http.config.RegistryBuilder;
    import org.apache.http.conn.ssl.SSLContexts;
    import org.apache.http.conn.ssl.TrustStrategy;
    import org.apache.http.conn.ssl.X509HostnameVerifier;
    import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
    import org.apache.http.impl.nio.client.HttpAsyncClients;
    import org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager;
    import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor;
    import org.apache.http.impl.nio.reactor.IOReactorConfig;
    import org.apache.http.nio.conn.NoopIOSessionStrategy;
    import org.apache.http.nio.conn.SchemeIOSessionStrategy;
    import org.apache.http.nio.conn.ssl.SSLIOSessionStrategy;
    
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLException;
    import javax.net.ssl.SSLSession;
    import javax.net.ssl.SSLSocket;
    import java.io.IOException;
    import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;
    
    public class Test
    {
        private static final DynamicIntProperty MAX_TOTAL_CONNECTIONS = DynamicPropertyFactory.getInstance().getIntProperty("X.total.connections", 40);
        private static final DynamicIntProperty ROUTE_CONNECTIONS = DynamicPropertyFactory.getInstance().getIntProperty("X.total.connections", 40);
        private static final DynamicIntProperty CONNECT_TIMEOUT = DynamicPropertyFactory.getInstance().getIntProperty("X.connect.timeout", 60000);
        private static final DynamicIntProperty SOCKET_TIMEOUT = DynamicPropertyFactory.getInstance().getIntProperty("X.socket.timeout", -1);
        private static final DynamicIntProperty CONNECTION_REQUEST_TIMEOUT = DynamicPropertyFactory.getInstance().getIntProperty("X.connectionrequest.timeout", 60000);
        private static final DynamicBooleanProperty STALE_CONNECTION_CHECK = DynamicPropertyFactory.getInstance().getBooleanProperty("X.checkconnection", true);
    
        public static void main(String[] args) throws Exception
        {
    
            SSLContext sslcontext = SSLContexts.custom()
                    .useTLS()
                    .loadTrustMaterial(null, new TrustStrategy()
                    {
                        @Override
                        public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException
                        {
                            return true;
                        }
                    })
                    .build();
            SSLIOSessionStrategy sslSessionStrategy = new SSLIOSessionStrategy(sslcontext, new AllowAll());
    
            Registry sessionStrategyRegistry = RegistryBuilder.create()
                    .register("http", NoopIOSessionStrategy.INSTANCE)
                    .register("https", sslSessionStrategy)
                    .build();
    
            DefaultConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(IOReactorConfig.DEFAULT);
            PoolingNHttpClientConnectionManager connectionManager = new PoolingNHttpClientConnectionManager(ioReactor, sessionStrategyRegistry);
            connectionManager.setMaxTotal(MAX_TOTAL_CONNECTIONS.get());
            connectionManager.setDefaultMaxPerRoute(ROUTE_CONNECTIONS.get());
    
            RequestConfig requestConfig = RequestConfig.custom()
                    .setSocketTimeout(SOCKET_TIMEOUT.get())
                    .setConnectTimeout(CONNECT_TIMEOUT.get())
                    .setConnectionRequestTimeout(CONNECTION_REQUEST_TIMEOUT.get())
                    .setStaleConnectionCheckEnabled(STALE_CONNECTION_CHECK.get())
                    .build();
    
            CloseableHttpAsyncClient httpClient = HttpAsyncClients.custom()
                    .setSSLStrategy(sslSessionStrategy)
                    .setConnectionManager(connectionManager)
                    .setDefaultRequestConfig(requestConfig)
                    .build();
    
            httpClient.start();
    
            // use httpClient...
        }
    
        private static class AllowAll implements X509HostnameVerifier
        {
            @Override
            public void verify(String s, SSLSocket sslSocket) throws IOException
            {}
    
            @Override
            public void verify(String s, X509Certificate x509Certificate) throws SSLException {}
    
            @Override
            public void verify(String s, String[] strings, String[] strings2) throws SSLException
            {}
    
            @Override
            public boolean verify(String s, SSLSession sslSession)
            {
                return true;
            }
        }
    }
    

提交回复
热议问题