Apache httpclient로 유효하지 않은 SSL 인증서를 처리하는 방법은 무엇입니까? [복제하다
-
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를 작성하는 방법을 보여줍니다.
여기에 답을 붙여 넣으십시오.
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