Java 7 (Oracle JVM)을 실행하는 Tomcat 7에 Java 웹 응용 프로그램이 배포되었습니다.SSL 요청이 프로덕션에서 실패한 경우에만
외부 HTTPS URL에 대한 모든 Apache HTTPClient 요청이 실패합니다 (프로덕션에만 해당). 이유는 잘 모릅니다. JVM과 함께 설치되는 cacerts truststore를 확인했으며 모든 인증서가 유효합니다.
내 개발 컴퓨터에 JVM 및 Tomcat 디렉토리를 다운로드했으며 동일한 경로, 동일한 매개 변수 등으로 webapp을 실행했으며 작동합니다.
프로덕션 환경에서 HTTPS 요청을하는 독립 실행 형 JAR을 실행해도 작동합니다.
이 시점에서 저는 솔직하게 아이디어가 없습니다. 스택 트레이스의
InputStream is=null;
HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, 2000);
HttpConnectionParams.setSoTimeout(httpParams, 2000);
DefaultHttpClient httpclient = new DefaultHttpClient(httpParams);
try {
httpclient.getParams().setParameter("http.useragent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
HttpContext localContext = new BasicHttpContext();
HttpHead httphead = new HttpHead(url);
HttpResponse response = httpclient.execute(httphead, localContext);
HttpGet httpget = new HttpGet(url);
response = httpclient.execute(httpget, localContext);
HttpEntity entity = response.getEntity();
is= new ByteArrayInputStream(EntityUtils.toByteArray(entity));
} catch (IOException ie) {
throw new IOException("IO exception",ie);
} finally {
httpclient.getConnectionManager().shutdown();
}
return is;
예 :
Caused by: javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
at sun.security.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:421)
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:128)
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:390)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:148)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:561)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:415)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
톰캣 JAVA_OPTS :
하드JAVA_OPTS="-server -Xms4g -Xmx4g -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC -XX:+DisableExplicitGC -Dfile.encoding=UTF-8 -Djavax.net.ssl.trustStore=/usr/lib/jvm/java-7-oracle/jre/lib/security/cacerts -Djavax.net.ssl.trustStorePassword=changeit"
실제 프로덕션 서버의 일부 CLI 도구를 사용하여 액세스 한 URL에 대한 SSL 인증서를 확인한 다음이 인증서가 브라우저를 사용하여 로컬로 가져온 인증서와 일치하는지 확인해야합니다. 일부 옵션에 대해서는 [이 질문] (http://serverfault.com/questions/661978/displaying-a-remote-ssl-certificate-details-using-cli-tools)을 참조하십시오. 어쩌면 원격 SSL을 종료하는 프록시가 있습니다. – dpr
@dpr 감사합니다. 슬프게도 일치합니다. 나는 imgur 또는 mailgun과 같은 잘 알려진 서비스에 연결하고 있습니다. – kai