需要

2017-11-27 1 views
0
にjavax.net.debugを有効にする方法

当社のアプリケーションが使用するApacheのHttpClientを4.5.3私たちは、サーバーが返すように設定されて需要

SNI機能を使用して、当社のクライアントとサーバー間の通信に非常に奇妙な行動を観察していますクライアントから期待されるサーバー名(つまり、サーバーのホスト名)にSSL要求が含まれ、他のすべてのドメイン名に対して自己署名証明書を返す場合、Go Daddyは証明書に署名します。

動作の観察

  • クライアントは、 e生産マシン以外のすべてのサーバー上の正しいサーバー証明書
  • クライアントコードがtomcat 8にデプロイされたアプリケーションで実行されているため、エンドポイントへの最初の要求が正常に処理されています。実行した後、クライアントでSSL例外が発生します。
  • サーバーが正しい証明書を送信していない(デフォルトの自己署名証明書を送信している)ため
  • クライアントが展開されているTomcatサーバーを再起動すると、呼び出しが正常に終了します。

これまではデバッグにjavax.net.debugを使用していましたが、その場合はtomcatサーバーを再起動してtomcatサーバーを再起動する必要があるため、この場合は使用できません。エンドポイント・サーバーへの呼び出しが成功するようになります。 また、javax.net.debugは多くの情報をログに記録します。その情報はログに記録されるため、特定の要求に対してのみ有効にします。私は、我々は唯一のSSLサーバ名表示を印刷するために使用できるかの確認 https://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html#OwnX509ETM を通じてではなく、読んでいる私たちは、(エンドポイントに渡されたサーバー名が含まれています)のみのクライアントこんにちは

をログに記録するように望んでいる はにプッシュダウンサーバー。

答えて

0

私はあなたと同じ懸念を抱いていましたが、最初に私は環境変数を動的に追加することを考えていましたが、常に古い価値があります。次に、javax.net.debug環境変数は、静的ブロックSSLSocketFactory.javaに1回だけ読み込まれることが分かりました。完全なソースコードはhereです。

static { 
    String s = java.security.AccessController.doPrivileged(
     new GetPropertyAction("javax.net.debug", "")).toLowerCase(Locale.ENGLISH); 
    DEBUG = s.contains("all") || s.contains("ssl"); 
} 
+0

返信いただきありがとうございます@Apolozeus。 私たちが直面している問題は、server_name(SNIに必要)が突然サーバーに渡されなくなることです。クライアントがデプロイされているサーバーを再起動すると、server_nameは再びパススルーを開始し、しばらくしてから再度失敗します。私たちはこれに対するパターンを見つけることができません。あなたが同じような問題に直面したかどうかを知ることに興味を持ちます。条件付きで行われたsslデバッグが必要な場合もあります。 –

+0

私はあなたの懸念を理解しています。(例:sslデバッグを有効/しかし、ネットワーキングフレームワークのほとんどは最終的にSSLSocketFactory.javaクラス(JDKに同梱)を使用しています。また、静的ブロックで 'java.net.debug'値が読み込まれるので、このクラスが初めて参照されるときにだけ、値は読み込まれ、JVMで同じままです。だから私は条件付きでこのフラグの値を変更する方法はないと思う。 – Apolozeus

関連する問題