Apache HttpClient로 유효하지 않은 SSL 인증서를 처리하는 방법은 무엇입니까? [복제]
이 질문에는 이미 답변이 있습니다.
이 문제에 대해 여러 가지 다른 질문과 답변이 있습니다 ...하지만 이해할 수 없습니다 ...
나는 : 우분투 -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 신뢰 저장소에 추가하십시오.
다음은 모든 인증서를 수락하는 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 프로그램을 다운로드하여 실행하십시오
% java InstallCert _web_site_hostname_
이 프로그램은 지정된 호스트에 대한 연결을 열고 SSL 핸드 셰이크를 시작했습니다. 발생한 오류의 예외 스택 추적을 인쇄하고 서버에서 사용 된 인증서를 표시합니다. 이제 신뢰할 수있는 키 저장소에 인증서를 추가하라는 메시지가 표시됩니다.
마음이 바뀌었다면 '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);
그런 다음 SecureProtocolSocketFactory
this를 사용하려면 Apache HTTP Client 3.x를 구현하여이를 설정해야합니다 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 예제는 여기서 찾을 수 있습니다 . 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가 연결을 찾기 위해 지정된 connectionManager를 사용하고 지정된 connectionManager가 사용자 정의 된 SSLConnectionSocketFactory를 등록하지 않았기 때문입니다. 이를 해결하려면 사용자 정의 된 SSLConnectionSocketFactory를 connectionManager에 등록해야합니다. 올바른 코드는 다음과 같아야합니다.
PoolingHttpClientConnectionManager connectionManager = new
PoolingHttpClientConnectionManager(RegistryBuilder.
<ConnectionSocketFactory>create()
.register("http",PlainConnectionSocketFactory.getSocketFactory())
.register("https", sslConnectionSocketFactory).build());
CloseableHttpClient client = HttpClients.custom()
.setConnectionManager(connectionManager)
.build();
Java Cert Store가 있으면 ( 위에서 만든 훌륭한 InstallCert 클래스를 사용하여) Java 시작시 "javax.net.ssl.trustStore"매개 변수를 전달하여 Java Cert Store 를 사용할 수 있습니다.
전의:
java -Djavax.net.ssl.trustStore=/path/to/jssecacerts MyClassName
자체 서명 된 테스트 인증서와 관련하여 발생할 수있는 또 다른 문제는 다음과 같습니다.
java.io.IOException : HTTPS 호스트 이름이 잘못되었습니다 :
이 오류는 HTTPS URL에 액세스하려고 할 때 발생합니다. 서버 인증서를 JRE의 키 저장소에 이미 설치했을 수 있습니다. 그러나이 오류는 서버 인증서의 이름이 URL에 언급 된 서버의 실제 도메인 이름과 일치하지 않음을 의미합니다. 이것은 일반적으로 CA에서 발급하지 않은 인증서를 사용하는 경우에 발생합니다.
이 예제는 인증서 서버 이름을 무시하는 HttpsURLConnection DefaultHostnameVerifier를 작성하는 방법을 보여줍니다.
http://www.java-samples.com/showtutorial.php?tutorialid=211
여기에 답을 붙여 넣고 싶습니다.
Apache HttpClient 4.5.5에서
Apache 클라이언트 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에서 문제가 발생하여 자체 ProtocolSocketFactory를 구현했습니다.
먼저 등록해야합니다.
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
바람둥이를 다시 시작해야합니다
DefaultTrustManager와 함께 다음을 사용했으며 http 클라이언트에서 매력처럼 작동했습니다. 정말 감사합니다!! @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 키 저장소에 다시 입력하기 만하면됩니다. 아래 명령을 사용하여 수행 할 수 있습니다.
$ keytool -import -alias ANY_NAME_YOU_WANT_TO_GIVE -file PATH_TO_YOUR_CERTIFICATE -keystore PATH_OF_JAVA_KEYSTORE
암호를 요청하면 위의 명령을 실행할 때 권한 오류가 발생하면 기본 암호 'changeit'을 시도하십시오. Windows에서는 관리 모드에서 엽니 다. 맥과 유닉스에서는 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
'IT story' 카테고리의 다른 글
JavaScript 리스너, "keypress"가 백 스페이스를 감지하지 못합니까? (0) | 2020.07.14 |
---|---|
svn에서 체크 아웃 된 Android 프로젝트를 열 때 "subversion 명령 줄 클라이언트 : svn을 사용할 수 없습니다"오류 (0) | 2020.07.14 |
주어진 클래스의 계층 구조로 모든 기본 클래스를 나열합니까? (0) | 2020.07.14 |
Java를 사용하여 텍스트를 클립 보드에 복사 (0) | 2020.07.14 |
부트 스트랩 4 센터 수직 및 수평 정렬 (0) | 2020.07.14 |