2016-12-19 14 views
0

私は、Java 7(Oracle JVM)を実行しているTomcat 7にJava Webアプリケーションをデプロイしています。SSL要求の生成に失敗した場合

私のApache HTTPClientの外部HTTPSリクエストに対するリクエストはすべて失敗しています(プロダクションのみ)。その理由はわかりません。私は、JVMと共にインストールされたcacertsトラストストアをチェックしており、すべての証明書が有効です。

開発マシンに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) 

Tomcatの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

のためにリンクの下に参照してください。私がリクエストを送信していたウェブサイトの私はそのファイルをOpenJDKパッケージのcacertsファイルに置き換え、すべてが再び動作しています。

3

あなたの環境にアクセスすることなく伝えるのは難しいです。私がチェックしたい最初のもの:

  • はあなたが本当にあなたがあなたのユーザーのホームディレクトリに.sshディレクトリをチェックし
  • を使用していると思うJVMおよびトラストストアを使用していることを確認してください。
  • plinkのようにローカルで実行されているsslツールがありますか?
  • SSLに関連する環境変数が設定されていますか?
  • プロダクションサーバーのファイアウォール設定は何ですか?あなたはポート8443 でHTTPSを設定する必要が
+0

1. ps auxを実行して正しいJVMを実行していたかどうか確認しました。 grep java。 2. .sshディレクトリをチェックするのはなぜですか? 3.私はSSLツールを実行していません。 4. Tomcatはwww-dataユーザーの下で動作しています。ここには環境変数があります:http://pastie.org/10983959 5. iptables:OUTPUT ACCEPT http://pastie.org/10983960 – kai

+0

変更されたのは、私はサイトをHTTPからHTTPSに切り替えましたが、Cloudflareを設定することでそれを行いました。私自身のnginxとtomcatはHTTP上で動作します。 – kai

関連する問題