2017-07-05 5 views
1

jbossおよびrhelイメージで実行されているJavaアプリケーションを使用しています。このアプリは転送プロキシとして機能します。ユーザーはそれを認証しなければなりません。そして、すべての要求は別のmvcアプリケーションに転送され、応答はフォワードプロキシ/認証アプリケーションにリダイレクトされます。また、Webサービスを使用してユーザーの資格情報をチェックします。このWebサービスのチェックは正常に機能します。通常のhttpアドレスにアクセスするときに証明書を見つけられなかったため、DefaultHttpClient.executeが失敗するのはなぜですか?

java転送プロキシの背後にあるmvcは、.NET mvcアプリケーションです。このアーキテクチャーは物理サーバ上でうまく動作しますが、私はオープンシフトポッドでの作業に1週間以上苦労しています。

資格情報が正常にWebサービスに対して検証された後、javaアプリケーションはmvcアプリケーション上のリソースにアクセスしようとします。これは、呼び出し側が安全であることを確認した後です(実際にはクライアントコードでget要求を受け取り、コードが有効な場合はhttp://Mvc/Administration/Administration?membershipNumber=409738467360)、要求をWelcomeビューにリダイレクトします。

ログファイルを見ると、mvcアプリがgetリクエストのために最初に200を返すことがわかります。また、リダイレクト(302)からウェルカム(Welcome)ビューを受信します(この通信はすべてhttpsではなくhttpで行われます)。

その後、クラッシュします。

javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIXパスの構築に失敗しました:sun.security.provider.certpath.SunCertPathBuilderException:要求されたターゲットに

を有効な証明書パスを見つけることができませんがここにありますDefaultHttpClientリダイレクトコード:

httpClient.setRedirectStrategy(new DefaultRedirectStrategy(){ 
     @Override 
     public boolean isRedirected(HttpRequest request, HttpResponse response, HttpContext context) 
       throws ProtocolException { 


      logger.info("Reverse proxy response: " + response.getStatusLine().getStatusCode()); 

      boolean isRedirect = super.isRedirected(request, response, context); 
      int responseCode = response.getStatusLine().getStatusCode(); 
      logger.info("Is redirect " + isRedirect); 
      if (!isRedirect) { 
       if (responseCode == 301 || responseCode == 302) { 
        logger.info("Forward proxy returning true"); 
        return true; 
       } 
      } 
      logger.info("Forward proxy returning " + isRedirect); 
      return isRedirect; 

     } 
    }); 

私は何が間違っているのか全く分かりません。試してみるべきものはありません。どんな助けもありがたいです!

ありがとうございます!

+0

手作りのソリューションを掲載しました。詳しい説明が必要な場合はお知らせください。 – Nathan

+0

こんにちはネイサン、私はそれを試してみると、あなたに戻って、感謝! –

答えて

0

エラーとして、指定したパラメータで接続を保護することはできません。 ハンドシェイクできないので、あなたはxxx siteのふりをするの間違ったウェブサイトでかもしれません。 ことが望ましい行動だ場合は、この回避策を使用することができます。

SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext(), new NoopHostnameVerifier()); 
CloseableHttpClient httpclient = HttpClients.custom() 
     .setMaxConnPerRoute(20) 
     .setMaxConnTotal(200) 
     .setSSLSocketFactory(csf) 
     .build(); 

これは、基本的には、証明書のハンドシェイクを無効にします。

+0

こんにちはNathan、それは働いた、私はSSLに関連する例外を取得していないよ。しかし、今私は/ Home/WelcomeViewに到達しようとすると302ループになります。しかし、このクエリでは、ソリューションがうまくいった、ありがとう! –

関連する問題