이 예외와 관련된 거의 모든 게시물을 보았습니다. 사실 내 문제는 내가 URL을 치고 그것을 통해 응답을 받고있는 Java 응용 프로그램입니다. URL을 칠피어가 Java에서 인증되지 않았습니다.
코드입니다 : 내가
javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
을 얻고있다
HttpGet getRequest = new HttpGet("https://urlto.esb.com");
HttpResponse httpResponse = null;
DefaultHttpClient httpClient = new DefaultHttpClient();
httpResponse = httpClient.execute(getRequest);
그래서 일부 Google 검색 후 나는 응용 프로그램이 실행되는 자바의 키 저장소에 인증서를 가져올 수 있다는 것을 알게. 그래서 키 저장소에 인증서를 가져 왔고이 코드가 작동 중입니다. 하지만이 솔루션을 원하지 않으므로 검색을 한 번 더 수행하면 키 저장소에 인증서를 가져 오지 않고 동일한 작업에 TrustManager
을 사용할 수 있음을 알게됩니다. 그래서 내가 작성한 코드는 같은 :
@Test
public void withTrustManeger() throws Exception {
DefaultHttpClient httpclient = buildhttpClient();
HttpGet httpGet = new HttpGet("https://urlto.esb.com");
HttpResponse response = httpclient.execute(httpGet);
HttpEntity httpEntity = response.getEntity();
InputStream inputStream = httpEntity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(
inputStream));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
inputStream.close();
String jsonText = sb.toString();
System.out.println(jsonText);
}
private DefaultHttpClient buildhttpClient() throws Exception {
DefaultHttpClient httpclient = new DefaultHttpClient();
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, getTrustingManager(), new java.security.SecureRandom());
SSLSocketFactory socketFactory = new SSLSocketFactory(sc);
Scheme sch = new Scheme("https", 443, socketFactory);
httpclient.getConnectionManager().getSchemeRegistry().register(sch);
return httpclient;
}
private TrustManager[] getTrustingManager() {
TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkClientTrusted(X509Certificate[] certs, String authType) {
// Do nothing
}
@Override
public void checkServerTrusted(X509Certificate[] certs, String authType) {
// Do nothing
}
} };
return trustAllCerts;
}
이 코드는 작동하지만, 내 질문에 내가 연결이 신뢰할 수있는 다음 방법 인증서에 관련된 아무것도 확인하고 있지 않다이다. 디버깅 후 나는 checkServerTrusted
이 타격 중임을 알게되었습니다. 그래서 certs
에 들어있는 인증서와 일부 .cer 또는 .crt 파일과 같은 내 응용 프로그램에있는 인증서의 유효성을 검사하기 위해 checkServerTrusted
에 무엇인가를 적어 놓았습니다.
모든 도움을 주실 수 있습니다.
SSLContext sslcontext = null;
try {
SSLContextBuilder sslContextBuilder = SSLContexts.custom()
.loadTrustMaterial(trustStore, new TrustSelfSignedStrategy());
sslcontext = sslContextBuilder.build();
장소 :
업데이트 @EpicPandaForce 후 아파치 HttpClient를 4.x의를 사용하는 것처럼보고,
try
{
keyStore = KeyStore.getInstance("JKS");
InputStream inputStream = new FileInputStream("E:\\Desktop\\esbcert\\keystore.jks");
keyStore.load(inputStream, "key".toCharArray());
SSLContextBuilder sslContextBuilder = SSLContexts.custom().loadTrustMaterial(keyStore, new TrustSelfSignedStrategy());
sslcontext = sslContextBuilder.build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext);
HttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
HttpGet httpGet = new HttpGet("https://url.esb.com");
HttpResponse response = httpclient.execute(httpGet);
HttpEntity httpEntity = response.getEntity();
InputStream httpStram = httpEntity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(
httpStram));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
httpStram.close();
inputStream.close();
String jsonText = sb.toString();
System.out.println(jsonText);
}
catch(Exception e)
{
System.out.println("Loading keystore failed.");
e.printStackTrace();
}
당신이 본 http://stackoverflow.com/questions/8693991/java-ignore-expired-ssl-sertificate/8694377 # 8694377? – EpicPandaForce
@EpicPandaForce, 예, 인증서를 확인할 수있는 방법은 무엇입니까? 내가 가진 것과 서버에서 나온 것을 의미합니다. – Amogh