Apache httpclient로 유효하지 않은 SSL 인증서를 처리하는 방법은 무엇입니까? [복제하다

StackOverflow https://stackoverflow.com/questions/1828775

  •  11-09-2019
  •  | 
  •  

문제

이 문제에 대한 많은 질문과 답이 많이 있지만 ... 이해할 수 없습니다 ...

나는 다음과 같이있다 : Ubuntu-9.10-desktop-amd64 + netbeans6.7.1은 "그대로"꺼짐 "에서 설치되었습니다. 대표. HTTPS의 일부 사이트에 연결해야합니다. 이를 위해 나는 Apache의 httpclient를 사용합니다.

튜토리얼에서 나는 읽었다 :

"JSSE가 올바르게 설치되면 SSL을 통해 보안 HTTP 통신이
일반 HTTP 커뮤니케이션으로 간단합니다. "및 일부 예 :

HttpClient httpclient = new HttpClient();
GetMethod httpget = new GetMethod("https://www.verisign.com/"); 
try { 
  httpclient.executeMethod(httpget);
  System.out.println(httpget.getStatusLine());
} finally {
  httpget.releaseConnection();
}

지금까지 나는 이것을 씁니다.

HttpClient client = new HttpClient();

HttpMethod get = new GetMethod("https://mms.nw.ru");
//get.setDoAuthentication(true);

try {
    int status = client.executeMethod(get);
    System.out.println(status);

    BufferedInputStream is = new BufferedInputStream(get.getResponseBodyAsStream());
    int r=0;byte[] buf = new byte[10];
    while((r = is.read(buf)) > 0) {
        System.out.write(buf,0,r);
    }

} catch(Exception ex) {
    ex.printStackTrace();
}

결과적으로 일련의 오류가 있습니다.

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
        at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1627)
        at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:204)
        at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:198)
        at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:994)
        at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:142)
        at sun.security.ssl.Handshaker.processLoop(Handshaker.java:533)
        at sun.security.ssl.Handshaker.process_record(Handshaker.java:471)
        at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:904)
        at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1132)
        at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:643)
        at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:78)
        at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
        at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
        at org.apache.commons.httpclient.HttpConnection.flushRequestOutputStream(HttpConnection.java:828)
        at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2116)
        at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1096)
        at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)
        at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
        at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
        at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
        at simpleapachehttp.Main.main(Main.java:41)
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:302)
        at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:205)
        at sun.security.validator.Validator.validate(Validator.java:235)
        at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:147)
        at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:230)
        at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:270)
        at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:973)
        ... 17 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:191)
        at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:255)
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:297)
        ... 23 more

가장 간단한 SSL 연결을 만들려면 어떻게해야합니까? (아마도 KeyManager 및 Trust Manager 등이 없을 것입니다.)

도움이 되었습니까?

해결책

https://mms.nw.ru 기본 신탁 관리자 세트에 포함되지 않은 자체 서명 인증서를 사용합니다.

다음 중 하나가 필요합니다.

  • 모든 증명서를 수락하는 TrustManager로 sslcontext를 구성하십시오 (아래 참조).

  • 인증서가 포함 된 적절한 신뢰 스토어로 SSLContext를 구성하십시오.

  • 해당 사이트의 인증서를 기본 Java Trust Store에 추가하십시오.

다음은 모든 증명서를 수락하는 (대부분 무가치 한) SSL 컨텍스트를 작성하는 샘플 프로그램입니다.

import java.net.URL;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class SSLTest {

    public static void main(String [] args) throws Exception {
        // configure the SSLContext with a TrustManager
        SSLContext ctx = SSLContext.getInstance("TLS");
        ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom());
        SSLContext.setDefault(ctx);

        URL url = new URL("https://mms.nw.ru");
        HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
        conn.setHostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String arg0, SSLSession arg1) {
                return true;
            }
        });
        System.out.println(conn.getResponseCode());
        conn.disconnect();
    }

    private static class DefaultTrustManager implements X509TrustManager {

        @Override
        public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}

        @Override
        public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}

        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
    }
}

다른 팁

https://mms.nw.ru 인증 기관이 발행하지 않은 인증서를 사용합니다. 결과적으로 설명대로 신뢰할 수있는 Java 키 스토어에 인증서를 추가해야합니다. 요청 된 대상에 대한 유효한 인증 경로를 찾을 수 없습니다:

HTTPS 프로토콜에서 실행되는 SSL 활성화 서버와 함께 작동하는 클라이언트에서 작업 할 때 '서버 인증서가 인증 기관에 의해 발행되지 않은 경우'요청 된 대상에 대한 유효한 인증 경로를 찾을 수 없지만 '오류가 발생할 수 있습니다. 개인 CMS.

당황하지 말 것. 클라이언트가 Java로 작성된 경우 신뢰할 수있는 Java 키 스토어에 서버 인증서를 추가하는 것만 큼해야합니다. 서버가 설치된 시스템에 어떻게 액세스 할 수 없는지 궁금 할 것입니다. 간단한 프로그램이 도움이 될 수 있습니다. 다운로드하십시오 자바 프로그램 그리고 달리기

% java InstallCert _web_site_hostname_

이 프로그램은 지정된 호스트와의 연결을 열고 SSL 핸드 셰이크를 시작했습니다. 발생한 오류의 예외 스택 추적을 인쇄하고 서버에서 사용하는 인증서를 보여줍니다. 이제 신뢰할 수있는 Keystore에 인증서를 추가 할 수 있습니다.

마음이 바뀌면 'Q'를 입력하십시오. 실제로 인증서를 추가하려면 '1'또는 기타 번호를 입력하여 다른 인증서, CA 인증서를 추가하지만 일반적으로 그렇게하고 싶지는 않습니다. 일단 선택한 후에는 프로그램이 전체 인증서를 표시 한 다음 현재 디렉토리에서 'JSSecacerts'라는 Java Keystore에 추가됩니다.

프로그램에서 사용하려면 JSSE를 신뢰 스토어로 사용하도록 구성하거나 $ java_home/jre/lib/security 디렉토리에 복사하십시오. 모든 Java 응용 프로그램이 JSSE뿐만 아니라 신뢰할 수있는 것으로 인증서를 인식하려면 해당 디렉토리에서 Cacerts 파일을 덮어 쓸 수도 있습니다.

결국 JSSE는 호스트와 악수를 완료 할 수 있으며 프로그램을 다시 실행하여 확인할 수 있습니다.

자세한 내용은 Leeland의 블로그를 확인할 수 있습니다. 더 이상 '요청 된 대상에 대한 유효한 인증 경로를 찾을 수 없습니다'

Pascal Thivent의 정답 외에도 또 다른 방법은 Firefox (인증서보기 -> 세부 사항 -> 내보내기)에서 인증서를 저장하는 것입니다. openssl s_client 신탁 스토어로 가져 오십시오.

해당 인증서를 확인하는 방법이있는 경우에만이 작업을 수행해야합니다. 실패하면 처음 연결하면 후속 연결에서 인증서가 예기치 않게 변경되면 최소한 오류가 발생합니다.

트러스트 스토어에서 가져 오려면 사용하십시오.

keytool -importcert -keystore truststore.jks -file servercert.pem

기본적으로 기본 신탁 스토어는 있어야합니다 lib/security/cacerts 그리고 암호는 있어야합니다 changeit, 보다 JSSE 참조 안내서 자세한 내용은.

전 세계적으로 해당 인증서를 허용하고 싶지 않지만 이러한 연결에 대해서만 SSLContext 그것을 위해:

TrustManagerFactory tmf = TrustManagerFactory
    .getInstance(TrustManagerFactory.getDefaultAlgorithm());
KeyStore ks = KeyStore.getInstance("JKS");
FileInputStream fis = new FileInputStream("/.../truststore.jks");
ks.load(fis, null);
// or ks.load(fis, "thepassword".toCharArray());
fis.close();

tmf.init(ks);

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), null);

그런 다음 Apache HTTP 클라이언트 3.x를 설정하여 하나를 구현하여 설정해야합니다. SecureProtocolSocketFactory 이것을 사용합니다 SSLContext. (예가 있습니다 여기).

Apache HTTP Client 4.X (가장 빠른 버전 외에)는 전달을 직접 지원합니다. SSLContext.

Apache httpclient 4.5 방법 :

org.apache.http.ssl.SSLContextBuilder sslContextBuilder = SSLContextBuilder.create();
sslContextBuilder.loadTrustMaterial(new org.apache.http.conn.ssl.TrustSelfSignedStrategy());
SSLContext sslContext = sslContextBuilder.build();
org.apache.http.conn.ssl.SSLConnectionSocketFactory sslSocketFactory =
        new SSLConnectionSocketFactory(sslContext, new org.apache.http.conn.ssl.DefaultHostnameVerifier());

HttpClientBuilder httpClientBuilder = HttpClients.custom().setSSLSocketFactory(sslSocketFactory);
httpClient = httpClientBuilder.build();

노트: org.apache.http.conn.ssl.SSLContextBuilder ~이다 감가 상각 된 그리고 org.apache.http.ssl.SSLContextBuilder 새로운 것입니다 (통지 conn 후자의 패키지 이름에서 누락).

에서 http://hc.apache.org/httpclient-3.x/sslguide.html:

Protocol.registerProtocol("https", 
new Protocol("https", new MySSLSocketFactory(), 443));
HttpClient httpclient = new HttpClient();
GetMethod httpget = new GetMethod("https://www.whatever.com/");
try {
  httpclient.executeMethod(httpget);
      System.out.println(httpget.getStatusLine());
} finally {
      httpget.releaseConnection();
}

mysslsocketfactory 예제를 찾을 수 있습니다 여기. 그것은 참조 a TrustManager, 모든 것을 신뢰하도록 수정할 수 있습니다 (이것을 고려해야하지만!)

Apache httpclient 4.5+ & Java8의 경우 :

SSLContext sslContext = SSLContexts.custom()
        .loadTrustMaterial((chain, authType) -> true).build();

SSLConnectionSocketFactory sslConnectionSocketFactory =
        new SSLConnectionSocketFactory(sslContext, new String[]
        {"SSLv2Hello", "SSLv3", "TLSv1","TLSv1.1", "TLSv1.2" }, null,
        NoopHostnameVerifier.INSTANCE);
CloseableHttpClient client = HttpClients.custom()
        .setSSLSocketFactory(sslConnectionSocketFactory)
        .build();

그러나 httpclient가 연결을 찾기 위해 ConnectionManager를 사용하는 경우 : 예를 들어 다음과 같습니다.

 PoolingHttpClientConnectionManager connectionManager = new 
         PoolingHttpClientConnectionManager();

 CloseableHttpClient client = HttpClients.custom()
            .setConnectionManager(connectionManager)
            .build();

그만큼 HttpClients.custom().setSSLSocketFactory(sslConnectionSocketFactory) 효과가 없습니다, 문제는 해결되지 않습니다.

HTTPClient는 Connection을 찾기 위해 지정된 ConnectionManager를 사용하고 지정된 ConnectionManager는 사용자 정의 된 sslConnectionSocketFactory를 등록하지 않았기 때문입니다. 이를 해결하려면 ConnectionManager에 사용자 정의 된 SSLConnectionSocketFactory를 등록해야합니다. 올바른 코드는 이것을 좋아해야합니다.

PoolingHttpClientConnectionManager connectionManager = new 
    PoolingHttpClientConnectionManager(RegistryBuilder.
                <ConnectionSocketFactory>create()
      .register("http",PlainConnectionSocketFactory.getSocketFactory())
      .register("https", sslConnectionSocketFactory).build());

CloseableHttpClient client = HttpClients.custom()
            .setConnectionManager(connectionManager)
            .build();

Java Cert 상점이 있으면 (사용하여 엄청난 위에 생성 된 installCert 클래스), Java Startup에서 "javax.net.ssl.truststore"Param을 통과하여 Java가 사용할 수 있습니다.

전:

java -Djavax.net.ssl.trustStore=/path/to/jssecacerts MyClassName

자체 서명 테스트 인식으로 실행할 수있는 또 다른 문제는 다음과 같습니다.

java.io.ioexception : https hostname 잘못 : Be ...

이 오류는 HTTPS URL에 액세스하려고 할 때 발생합니다. 서버 인증서를 JRE의 키 스토어에 이미 설치했을 수 있습니다. 그러나이 오류는 서버 인증서의 이름이 URL에 언급 된 서버의 실제 도메인 이름과 일치하지 않음을 의미합니다. 이것은 일반적으로 비 CA 발급 인증서를 사용하는 경우에 발생합니다.

이 예제는 인증서 서버 이름을 무시하는 httpsurlconnection defaulthostnameverifier를 작성하는 방법을 보여줍니다.

http://www.java-samples.com/showtutorial.php?tutorialid=211

여기에 답을 붙여 넣으십시오.

Apache에서 httpclient 4.5.5

Apache Client 4.5.5로 유효하지 않은 SSL 인증서를 처리하는 방법?

HttpClient httpClient = HttpClients
            .custom()
            .setSSLContext(new SSLContextBuilder().loadTrustMaterial(null, TrustAllStrategy.INSTANCE).build())
            .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
            .build();

모든 수표를 버리지 않고 런타임에서 신뢰할 수있는 호스트를 쉽게 추가 할 수있는 방법은 여기에서 코드를 사용해보십시오. http://code.google.com/p/self-signed-cert-trust-manager/.

EasySSLProtocolsocketFactory는 나에게 문제가 발생하여 고유 한 프로토콜 소소 크로도를 구현하게되었습니다.

먼저 등록해야합니다.

Protocol.registerProtocol("https", new Protocol("https", new TrustAllSSLSocketFactory(), 443));

HttpClient client = new HttpClient();
...

그런 다음 ProtocolsocketFactory를 구현합니다.

class TrustAllSSLSocketFactory implements ProtocolSocketFactory {

    public static final TrustManager[] TRUST_ALL_CERTS = new TrustManager[]{
        new X509TrustManager() {
            public void checkClientTrusted(final X509Certificate[] certs, final String authType) {

            }

            public void checkServerTrusted(final X509Certificate[] certs, final String authType) {

            }

            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        }
    };

    private TrustManager[] getTrustManager() {
        return TRUST_ALL_CERTS;
    }

    public Socket createSocket(final String host, final int port, final InetAddress clientHost,
                               final int clientPort) throws IOException {
        return getSocketFactory().createSocket(host, port, clientHost, clientPort);
    }

    @Override
    public Socket createSocket(final String host, final int port, final InetAddress localAddress,
                               final int localPort, final HttpConnectionParams params) throws IOException {
        return createSocket(host, port);
    }

    public Socket createSocket(final String host, final int port) throws IOException {
        return getSocketFactory().createSocket(host, port);
    }

    private SocketFactory getSocketFactory() throws UnknownHostException {
        TrustManager[] trustAllCerts = getTrustManager();

        try {
            SSLContext context = SSLContext.getInstance("SSL");
            context.init(null, trustAllCerts, new SecureRandom());

            final SSLSocketFactory socketFactory = context.getSocketFactory();
            HttpsURLConnection.setDefaultSSLSocketFactory(socketFactory);
            return socketFactory;
        } catch (NoSuchAlgorithmException | KeyManagementException exception) {
            throw new UnknownHostException(exception.getMessage());
        }
    }
}

참고 : 이것은 httpclient 3.1 및 Java 8입니다.

이것 링크 단계별 요구 사항을 설명합니다. 아래 링크의 프로세스를 진행할 수있는 인증서를 실제로 걱정하지 않는 경우.

참고 당신은 당신이하고있는 일을 두 번 확인하고 싶을 수도 있습니다. 이것은 안전하지 않은 작업입니다.

사용 InstallCert 생성합니다 jssecacerts 파일 및 수행-Djavax.net.ssl.trustStore=/path/to/jssecacerts 잘 작동했습니다.

httpclient 3.1.x를 사용하고 있습니다.

        try {
        SSLContext sslContext = SSLContext.getInstance("TLS");
        TrustManager trustManager = new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
            }

            @Override
            public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {

            }

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        };
        sslContext.init(null, new TrustManager[]{trustManager}, null);
        SslContextSecureProtocolSocketFactory socketFactory = new SslContextSecureProtocolSocketFactory(sslContext,false);
        Protocol.registerProtocol("https", new Protocol("https", (ProtocolSocketFactory) socketFactory, 443));//同样会影响到HttpUtils
    } catch (Throwable e) {
        e.printStackTrace();

}

public class SslContextSecureProtocolSocketFactory implements      SecureProtocolSocketFactory {

private SSLContext sslContext;
private boolean verifyHostname;

public SslContextSecureProtocolSocketFactory(SSLContext sslContext, boolean verifyHostname) {
    this.verifyHostname = true;
    this.sslContext = sslContext;
    this.verifyHostname = verifyHostname;
}

public SslContextSecureProtocolSocketFactory(SSLContext sslContext) {
    this(sslContext, true);
}

public SslContextSecureProtocolSocketFactory(boolean verifyHostname) {
    this((SSLContext)null, verifyHostname);
}

public SslContextSecureProtocolSocketFactory() {
    this((SSLContext)null, true);
}

public synchronized void setHostnameVerification(boolean verifyHostname) {
    this.verifyHostname = verifyHostname;
}

public synchronized boolean getHostnameVerification() {
    return this.verifyHostname;
}

public Socket createSocket(String host, int port, InetAddress clientHost, int clientPort) throws IOException, UnknownHostException {
    SSLSocketFactory sf = this.getSslSocketFactory();
    SSLSocket sslSocket = (SSLSocket)sf.createSocket(host, port, clientHost, clientPort);
    this.verifyHostname(sslSocket);
    return sslSocket;
}

public Socket createSocket(String host, int port, InetAddress localAddress, int localPort, HttpConnectionParams params) throws IOException, UnknownHostException, ConnectTimeoutException {
    if(params == null) {
        throw new IllegalArgumentException("Parameters may not be null");
    } else {
        int timeout = params.getConnectionTimeout();
        Socket socket = null;
        SSLSocketFactory socketfactory = this.getSslSocketFactory();
        if(timeout == 0) {
            socket = socketfactory.createSocket(host, port, localAddress, localPort);
        } else {
            socket = socketfactory.createSocket();
            InetSocketAddress localaddr = new InetSocketAddress(localAddress, localPort);
            InetSocketAddress remoteaddr = new InetSocketAddress(host, port);
            socket.bind(localaddr);
            socket.connect(remoteaddr, timeout);
        }

        this.verifyHostname((SSLSocket)socket);
        return socket;
    }
}

public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
    SSLSocketFactory sf = this.getSslSocketFactory();
    SSLSocket sslSocket = (SSLSocket)sf.createSocket(host, port);
    this.verifyHostname(sslSocket);
    return sslSocket;
}

public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
    SSLSocketFactory sf = this.getSslSocketFactory();
    SSLSocket sslSocket = (SSLSocket)sf.createSocket(socket, host, port, autoClose);
    this.verifyHostname(sslSocket);
    return sslSocket;
}

private void verifyHostname(SSLSocket socket) throws SSLPeerUnverifiedException, UnknownHostException {
    synchronized(this) {
        if(!this.verifyHostname) {
            return;
        }
    }

    SSLSession session = socket.getSession();
    String hostname = session.getPeerHost();

    try {
        InetAddress.getByName(hostname);
    } catch (UnknownHostException var10) {
        throw new UnknownHostException("Could not resolve SSL sessions server hostname: " + hostname);
    }

    X509Certificate[] certs = (X509Certificate[])((X509Certificate[])session.getPeerCertificates());
    if(certs != null && certs.length != 0) {
        X500Principal subjectDN = certs[0].getSubjectX500Principal();
        List cns = this.getCNs(subjectDN);
        boolean foundHostName = false;
        Iterator i$ = cns.iterator();
        AntPathMatcher matcher  = new AntPathMatcher();
        while(i$.hasNext()) {
            String cn = (String)i$.next();
            if(matcher.match(cn.toLowerCase(),hostname.toLowerCase())) {
                foundHostName = true;
                break;
            }
        }

        if(!foundHostName) {
            throw new SSLPeerUnverifiedException("HTTPS hostname invalid: expected \'" + hostname + "\', received \'" + cns + "\'");
        }
    } else {
        throw new SSLPeerUnverifiedException("No server certificates found!");
    }
}

private List<String> getCNs(X500Principal subjectDN) {
    ArrayList cns = new ArrayList();
    StringTokenizer st = new StringTokenizer(subjectDN.getName(), ",");

    while(st.hasMoreTokens()) {
        String cnField = st.nextToken();
        if(cnField.startsWith("CN=")) {
            cns.add(cnField.substring(3));
        }
    }

    return cns;
}

protected SSLSocketFactory getSslSocketFactory() {
    SSLSocketFactory sslSocketFactory = null;
    synchronized(this) {
        if(this.sslContext != null) {
            sslSocketFactory = this.sslContext.getSocketFactory();
        }
    }

    if(sslSocketFactory == null) {
        sslSocketFactory = (SSLSocketFactory)SSLSocketFactory.getDefault();
    }

    return sslSocketFactory;
}

public synchronized void setSSLContext(SSLContext sslContext) {
    this.sslContext = sslContext;
}

}

httpclient의 경우 다음을 수행 할 수 있습니다.

SSLContext ctx = SSLContext.getInstance("TLS");
        ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom());
        SSLContext.setDefault(ctx);

        String uri = new StringBuilder("url").toString();

        HostnameVerifier hostnameVerifier = new HostnameVerifier() {
            @Override
            public boolean verify(String arg0, SSLSession arg1) {
                return true;
            }
        };

        HttpClient client = HttpClientBuilder.create().setSSLContext(ctx)
                .setSSLHostnameVerifier(hostnameVerifier).build()

installcert.java 프로그램 파일을 사용하여 SSL 인증서를 작성하려면 Java 1.7의 아래에 주어진 지침을 따르십시오.

https://github.com/escline/installcert

Tomcat을 다시 시작해야합니다

DefaultTrustManager와 함께 다음을 사용했으며 Charm과 같은 httpclient에서 작동했습니다. 엄청 고마워!! @Kevin과 다른 모든 기고자

    SSLContext ctx = null;
    SSLConnectionSocketFactory sslsf = null;
    try {

        ctx = SSLContext.getInstance("TLS");
        ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom());
        SSLContext.setDefault(ctx);

        sslsf = new SSLConnectionSocketFactory(
                ctx,
                new String[] { "TLSv1" },
                null,
                SSLConnectionSocketFactory.getDefaultHostnameVerifier());

    } catch (Exception e) {
        e.printStackTrace();
    }

     CloseableHttpClient client = HttpClients.custom()
            .setSSLSocketFactory(sslsf)
            .build();

나는 같은 문제에 직면하게되었고, 갑자기 모든 수입품이 빠졌다. .m2 폴더에서 모든 내용을 삭제하려고 시도했습니다. 그리고 모든 것을 다시 인상하려고 노력했지만 여전히 아무것도 효과가 없었습니다. 마침내 내가 한 일은 IDE가 내 브라우저에서 다운로드 할 수 없다고 불평하는 웹 사이트를 열었습니다. 그리고 그것이 사용중인 인증서를보고 내

$ keytool -v -list  PATH_TO_JAVA_KEYSTORE

내 키 스토어로가는 길은 /library/java/javavirtualmachines/jdk1.8.0_171.jdk/contents/home/jre/lib/security/cacerts입니다

그 특정 인증서는 없었습니다.

따라서 인증서를 Java JVM Keystore에 다시 넣기 만하면됩니다. 아래 명령을 사용하여 수행 할 수 있습니다.

$ keytool -import -alias ANY_NAME_YOU_WANT_TO_GIVE -file PATH_TO_YOUR_CERTIFICATE -keystore PATH_OF_JAVA_KEYSTORE

비밀번호를 묻는 경우 위 명령을 실행할 때 권한 오류가 발생하면 기본 비밀번호 'changeit'을 사용해보십시오. Windows에서는 관리 모드에서 열립니다. Mac 및 Unix에서 Sudo를 사용하십시오.

키를 성공적으로 추가 한 후에는 다음을 사용하여 볼 수 있습니다.

$ keytool -v -list  /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/lib/security/cacerts 

TEH 명령을 사용하여 SHA-1 만 볼 수 있습니다

$ keytool -list  /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/lib/security/cacerts 
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top