2016-12-19 2 views
0

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" 
+0

실제 프로덕션 서버의 일부 CLI 도구를 사용하여 액세스 한 URL에 대한 SSL 인증서를 확인한 다음이 인증서가 브라우저를 사용하여 로컬로 가져온 인증서와 일치하는지 확인해야합니다. 일부 옵션에 대해서는 [이 질문] (http://serverfault.com/questions/661978/displaying-a-remote-ssl-certificate-details-using-cli-tools)을 참조하십시오. 어쩌면 원격 SSL을 종료하는 프록시가 있습니다. – dpr

+0

@dpr 감사합니다. 슬프게도 일치합니다. 나는 imgur 또는 mailgun과 같은 잘 알려진 서비스에 연결하고 있습니다. – kai

답변

0

그것은 오라클 자바와 함께 번들로 cacerts 파일의 인증서 표시 루트 인증서에서 포함되지 않은 것으로 나타났다을 위해 아래 링크를 참조하시기 바랍니다 포트와 HTTPS를 구성해야 내가 요청을 보내는 웹 사이트의 그 파일을 OpenJDK 패키지의 cacerts 파일로 바꿨고 모든 것이 다시 작동합니다.

3

이 환경에 액세스하지 않고 말할 수

이 실패 예제 코드입니다. 첫 번째 일이 내가 확인할 것 :

  • 당신이 정말 당신이
  • 검사 사용자 홈 디렉토리에있는 SSH를 디렉토리를 사용하고 생각하는 JVM과 신뢰 저장소를 사용하고 있는지 확인하십시오.
  • plink와 같이 로컬에서 실행되는 모든 ssl 도구가 있습니까?
  • SSL과 관련된 환경 변수가 있습니까?
  • 프로덕션 서버의 방화벽 설정은 무엇입니까?
+0

1. ps aux를 실행하여 올바른 JVM을 실행했는지 확인했습니다. grep java. 2. .ssh 디렉토리를 확인해야하는 이유는 무엇입니까? 3. 나는 ssl 도구를 실행하지 않고있다. 4. Tomcat은 www 데이터 사용자로 실행되며 여기에 환경 변수가 있습니다. http://pastie.org/10983959 5. iptables : OUTPUT ACCEPT http://pastie.org/10983960 – kai

+0

유일한 변경 사항은 사이트를 HTTP에서 HTTPS로 전환했지만 Cloudflare를 구성하여이 작업을 수행했습니다. 내 자신의 nginx와 바람둥이는 HTTP에서 실행됩니다. – kai

관련 문제