web-dev-qa-db-ja.com

Java

RESTクライアントがアプリケーションに接続しようとしたときにSSLハンドシェイクが失敗した場合、ログに記録する必要があります。アプリケーションは、Spring BootとJava 8を使用してビルドされ、デプロイされていますTomcat 8。

SSLハンドシェイクが失敗するシナリオでは、TLS接続が壊れているため、TomcatはSSL証明書の検証に基盤となるJVMを使用しているため、ロギング要件をTomcatレイヤーまたはJavaで実行する必要がある場合があります。

<Connector port="8443" protocol="org.Apache.coyote.http11.Http11NioProtocol" SSLEnabled="true" scheme="https" secure="true" keystoreFile="keyStore-1.jks" keystorePass="password" keystoreType="jks" truststoreFile="TrustStore.jks" truststorePass="passwrd" truststoreType="jks" clientAuth="want" sslProtocol="TLSv1.2" />

デバッグレベルのログを有効にすることを知っています。

-Djavax.net.debug = ssl

しかし、これは多くの情報を記録し、プロセスを遅くします。また、成功したSSL検証も記録します。 JavaまたはTomcatレベルのいずれかの最小ログで障害ケースのみを有効にする方法はありますか?.

SSLデバッグログは非常に有効であるため、これをデバッグの観点から見ていません。この要件は、ロギングと監査の目的からのものであり、デバッグログを有効にすることは実現可能なオプションではありません。SSLが発生するエラーのみを記録し、hex/certデータのすべてを記録するメカニズムではありません。

10
Manu

残念ながら、それはおそらく可能ではありません。また、Tomcatとは関係ありません。 SSLのロギングは、アプリケーションの標準ロギングの一部ではありません。次のオプションで出力を減らしてみてください:

-Djava.net.debug=handshake

他の何人か:

  • record-各SSLレコードのトレースを(SSLプロトコルレベルで)印刷します。
  • ハンドシェイク-受信した各ハンドシェイクメッセージを出力します
  • keygen-秘密鍵交換用の鍵生成データを出力します。
  • session-SSLセッションアクティビティを出力します。
  • defaultctx-デフォルトのSSL初期化情報を出力します。
  • sslctx-SSLコンテキストに関する情報を出力します。
  • sessioncache-SSLセッションキャッシュに関する情報を出力します。
  • keymanager-キーマネージャの呼び出しに関する情報を出力します。
  • trustmanager-信頼マネージャーへの呼び出しに関する情報を出力します。
  • data-ハンドシェイクトレースの場合、各メッセージの16進ダンプを出力します。
  • verbose-ハンドシェイクトレースの場合、詳細情報を出力します。
  • plaintext-レコードトレースの場合、レコードの16進ダンプを出力します。

docs を参照してください。

これが本当に必要であり、アプリケーションにとってパフォーマンスが重要である場合、 SSLSocket (ドキュメントではハンドシェイクプロセスについて読むことができます)を [〜#〜] asm [〜#〜]で計測できます / Btrace /etcとその中のハンドシェイクの状態を確認します。しかし、その場合、デバッグ情報はありません-true/falseのみです。

Tomcat docs も参照してください。 Tomcatで使用されている JSSEImplementation クラスがあることがわかります。そしてそれはJSSEのラッパーです。

4
egorlitvinenko

同じ問題が何度もあり、次のようにクラックしました。 intelliJでプロジェクトをセットアップしました。

  1. VMオプションのデバッグレベルを設定します:-Djavax.net.debug = all(構成の編集-> VMオプション))保存して適用します。
  2. プロジェクト(アプリ)をデバッグモードで実行し、サーバーとクライアント間の呼び出しを確認します。たとえば次のように、コンソールのサーバーからクライアントへの追加のCertificateRequest呼び出しがあることがわかります。

*** CertificateRequest証明書タイプ:RSA、DSS、ECDSAサポートされている署名アルゴリズム:SHA512withRSA、不明(ハッシュ:0x6、署名:0x2)、SHA512withECDSA、SHA384withRSA、不明(ハッシュ:0x5、署名:0x2)、SHA384withECDSA、SHA256withRSA、不明( hash:0x4、signature:0x2)、SHA256withECDSA、SHA224withRSA、不明(hash:0x3、signature:0x2)、SHA224withECDSA、SHA1withRSA、SHA1withDSA、SHA1withECDSA認証局:

CN = Symantec Public Class 3、O = Symantec Corporation、C = US

CN = Symantec Class 3 Manage、OU = Symantec Trusted Network、O = Symantec、C = US

[読み取り] MD5およびSHA1ハッシュ:len = 302

  1. 上記のように「CN」を使用した証明書リクエストが表示される場合は、cacertキーストアにこれらの証明書がないことを意味します。

解決策:不足している証明書を追加します(この例では、2つの証明書CN = Symantec Public Class 3およびCN = Symantec Class 3 Manage)。

sSLプロトコルによるサーバーとクライアント間の呼び出しを理解する必要があります。サーバーとクライアントの通信方法の詳細については、次のリンクを確認してください。

https://docs.Oracle.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#InstallProbs

問題が発生した場合は、YouTubeビデオデモを提供します。

この解決策が誰かを助けることを願っています。

ありがとうございました。

1
Dhaumik