私は、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"
実際のプロダクションサーバーからCLIツールを使用してアクセスしたURLのSSL証明書を確認し、この証明書がブラウザを使用してローカルに取得したものと一致するかどうかを確認する必要があります。いくつかのオプションについては、[この質問](http://serverfault.com/questions/661978/displaying-a-remote-ssl-certificate-details-using-cli-tools)を参照してください。たぶんリモートSSLを終了する場所にいくつかのプロキシがありますか? – dpr
@dprありがとう、悲しいことに、彼らは一致します。私はimgurやmailgunのようなよく知られたサービスに接続しています。 – kai