SSL/TLS 設定方法

目次

クイックスタート

以下の説明では、$CATALINA_BASE 変数名を使用して、ほとんどの相対パスが解決されるベースディレクトリを参照します。CATALINA_BASE ディレクトリを設定して複数のインスタンス用に Tomcat を構成していない場合、$CATALINA_BASE は $CATALINA_HOME の値(Tomcat をインストールしたディレクトリ)に設定されます。

Tomcat で SSL/TLS サポートをインストールおよび構成するには、以下の簡単な手順に従う必要があります。詳細については、このハウツーの残りの部分をお読みください。

  1. 次のコマンドを実行して、サーバーの秘密キーと自己署名証明書を格納するキーストアファイルを作成します。

    Windows

    "%JAVA_HOME%\bin\keytool" -genkey -alias tomcat -keyalg RSA

    Unix

    $JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA

    パスワード値として「changeit」を指定します。

  2. $CATALINA_BASE/conf/server.xml の「SSL HTTP/1.1 コネクタ」エントリのコメントを解除し、以下の構成セクションの説明に従って変更します。

SSL/TLS の概要

トランスポート層セキュリティ(TLS)とその前身であるセキュアソケットレイヤー(SSL)は、Web ブラウザーと Web サーバーが安全な接続を介して通信できるようにするテクノロジーです。これは、送信されるデータが一方側で暗号化され、送信され、処理前に他方側で復号化されることを意味します。これは双方向プロセスであり、サーバーとブラウザーの両方がデータを送信する前にすべてのトラフィックを暗号化することを意味します。

SSL/TLS プロトコルのもう 1 つの重要な側面は、認証です。これは、安全な接続を介して Web サーバーと通信しようとした最初の試行中に、そのサーバーが、サイトが誰であり何であるかを証明するために、「証明書」の形式で一連の資格情報を Web ブラウザーに提示することを意味します。場合によっては、サーバーは Web ブラウザーから証明書を要求し、あなたが誰であるかの証明を要求することもあります。これは「クライアント認証」と呼ばれますが、実際には個々のユーザーよりも企業間(B2B)取引でより多く使用されます。ほとんどの SSL 対応 Web サーバーは、クライアント認証を要求しません。

SSL/TLS と Tomcat

セキュアソケットを利用するように Tomcat を構成する必要があるのは、通常、スタンドアロン Web サーバーとして実行する場合のみであることに注意することが重要です。詳細については、セキュリティに関する考慮事項ドキュメントを参照してください。Tomcat を主に、Apache や Microsoft IIS などの別の Web サーバーの背後にある Servlet/JSP コンテナとして実行する場合は、通常、プライマリ Web サーバーがユーザーからの SSL 接続を処理するように構成する必要があります。通常、このサーバーは SSL 関連のすべての機能をネゴシエートし、それらのリクエストを復号化した後でのみ、Tomcat コンテナ宛てのリクエストを渡します。同様に、Tomcat はクリアテキストの応答を返し、ユーザーのブラウザーに返される前に暗号化されます。この環境では、Tomcat はプライマリ Web サーバーとクライアント間の通信が安全な接続を介して行われていることを認識していますが(アプリケーションがこれについて質問できるようにする必要があるため)、暗号化や復号化自体には関与しません。

Tomcat は、基盤となる環境によって提供される暗号化プロトコルのいずれも使用できます。Java 自体は、JCE/JCA を通じて暗号化機能を提供し、JSSE を通じて暗号化通信機能を提供します。準拠する暗号化「プロバイダー」は、Tomcat に暗号化アルゴリズムを提供できます。組み込みプロバイダー(SunJCE)には、SSLv3、TLSv1、TLSv1.1 などのさまざまな SSL/TLS バージョンのサポートが含まれています。プロトコルとアルゴリズムのサポートの詳細については、Java のバージョンのドキュメントを確認してください。

オプションの tcnative ライブラリを使用する場合は、JCA/JCE/JSSE を介して OpenSSL 暗号化プロバイダーを使用できます。これにより、SunJCE プロバイダーと比較して、異なる暗号化アルゴリズムやパフォーマンス上のメリットが得られる可能性があります。プロトコルとアルゴリズムのサポートの詳細については、OpenSSL のバージョンのドキュメントを確認してください。

証明書

SSL を実装するには、Web サーバーは安全な接続を受け入れる各外部インターフェース(IP アドレス)に関連付けられた証明書を持っている必要があります。この設計の背後にある理論は、特に機密情報を受け取る前に、サーバーの所有者があなたが思っている人物であることを何らかの合理的な保証を提供する必要があるということです。証明書の詳細な説明はこのドキュメントの範囲外ですが、証明書をインターネットアドレスの「デジタルパスポート」と考えてください。この証明書には、サイトが関連付けられている組織と、サイトの所有者または管理者に関する基本連絡先情報が記載されています。

この証明書は、所有者によって暗号化的に署名されているため、他の誰かが偽造することは非常に困難です。証明書が訪問者のブラウザーで警告なしに機能するためには、信頼できる第三者によって署名されている必要があります。これらは認証局(CA)と呼ばれます。署名付き証明書を取得するには、CA を選択し、選択した CA が証明書を取得するために提供する手順に従う必要があります。無料で証明書を提供しているものを含め、さまざまな CA が利用可能です。

Java は、keytool と呼ばれる比較的単純なコマンドラインツールを提供しており、「自己署名」証明書を簡単に作成できます。自己署名証明書は、単に、よく知られた CA によって署名されていないユーザーが生成した証明書であり、したがって、まったく信頼できるとは限りません。自己署名証明書は一部のテストシナリオでは役立つ可能性がありますが、いかなる形式の運用使用にも適していません。

SSL 実行に関する一般的なヒント

SSL で Web サイトを保護する場合、サイトが使用するすべてのアセットが SSL 経由で提供されるようにすることが重要です。これにより、攻撃者が JavaScript ファイルなどに悪意のあるコンテンツを挿入することでセキュリティを回避できないようにします。Web サイトのセキュリティをさらに強化するには、HSTS ヘッダーを使用することを検討する必要があります。これにより、サイトには常に https 経由でアクセスする必要があることをブラウザーに伝えることができます。

安全な接続で名前ベースの仮想ホストを使用する場合は、単一の証明書に指定された名前を慎重に構成するか、サーバー名表示(SNI)サポートが利用可能な Tomcat 8.5 以降を使用する必要があります。SNI を使用すると、異なる名前を持つ複数の証明書を単一の TLS コネクタに関連付けることができます。

設定

証明書キーストアの準備

Tomcat は現在、JKSPKCS11、または PKCS12 形式のキーストアでのみ動作します。JKS 形式は Java の標準「Java キーストア」形式であり、keytool コマンドラインユーティリティによって作成される形式です。このツールは JDK に含まれています。PKCS12 形式はインターネット標準であり、(特に) OpenSSL および Microsoft の Key-Manager を介して操作できます。

キーストア内の各エントリは、エイリアス文字列によって識別されます。多くのキーストア実装ではエイリアスが大文字と小文字を区別しない方法で処理されますが、大文字と小文字を区別する実装も利用可能です。たとえば、PKCS11 仕様では、エイリアスが大文字と小文字を区別する必要があります。エイリアスの大文字と小文字の区別に関連する問題を回避するには、大文字と小文字のみが異なるエイリアスを使用しないことをお勧めします。

既存の証明書を JKS キーストアにインポートするには、keytool に関するドキュメント(JDK ドキュメントパッケージ内)をお読みください。OpenSSL はキーの前に読み取り可能なコメントを追加することがよくありますが、keytool はそれをサポートしていないことに注意してください。したがって、証明書にキーデータの前にコメントがある場合は、keytool で証明書をインポートする前に削除してください。

OpenSSL を使用して、独自の CA によって署名された既存の証明書を PKCS12 キーストアにインポートするには、次のようなコマンドを実行します。

openssl pkcs12 -export -in mycert.crt -inkey mykey.key
                       -out mycert.p12 -name tomcat -CAfile myCA.crt
                       -caname root -chain

より高度なケースについては、OpenSSL ドキュメントを参照してください。

単一の自己署名証明書を含む新しい JKS キーストアを最初から作成するには、ターミナルのコマンドラインから以下を実行します。

Windows

"%JAVA_HOME%\bin\keytool" -genkey -alias tomcat -keyalg RSA

Unix

$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA

(RSA アルゴリズムは安全なアルゴリズムとして推奨される必要があり、これにより他のサーバーやコンポーネントとの一般的な互換性も確保されます。)

このコマンドは、コマンドを実行したユーザーのホームディレクトリに、「.keystore」という名前の新しいファイルを作成します。別の場所またはファイル名を指定するには、上記の keytool コマンドに -keystore パラメーターを追加し、その後にキーストアファイルへの完全なパス名を指定します。後述するように、この新しい場所を server.xml 構成ファイルにも反映する必要があります。たとえば、

Windows

"%JAVA_HOME%\bin\keytool" -genkey -alias tomcat -keyalg RSA
  -keystore \path\to\my\keystore

Unix

$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA
  -keystore /path/to/my/keystore

このコマンドを実行すると、最初にキーストアパスワードの入力を求められます。Tomcat が使用するデフォルトのパスワードは「changeit」(すべて小文字)ですが、必要に応じてカスタムパスワードを指定することもできます。後述するように、server.xml 構成ファイルでカスタムパスワードを指定する必要もあります。

次に、会社、連絡先名など、この証明書に関する一般的な情報の入力を求められます。この情報は、アプリケーションの安全なページにアクセスしようとするユーザーに表示されるため、ここで提供される情報がユーザーの期待と一致するようにしてください。

最後に、キーパスワードの入力を求められます。これは、(同じキーストアファイルに格納されている他の証明書とは対照的に) この証明書専用のパスワードです。keytool プロンプトには、ENTER キーを押すと、キーのパスワードとしてキーストアと同じパスワードが自動的に使用されることが示されます。同じパスワードを使用することも、カスタムパスワードを選択することもできます。キーストアパスワードとは異なるパスワードを選択した場合は、後述するように server.xml 構成ファイルでカスタムパスワードを指定する必要があります。

すべてが成功すれば、サーバーで使用できる証明書付きのキーストアファイルが作成されます。

Tomcat 設定ファイルの編集

Tomcatは、SSLの2つの異なる実装を使用できます。

  • Javaランタイムの一部として提供されるJSSE実装
  • OpenSSLを使用するJSSE実装

具体的な構成の詳細は、どちらの実装を使用しているかによって異なります。汎用的なprotocol="HTTP/1.1"を指定してConnectorを構成した場合、Tomcatで使用される実装は自動的に選択されます。インストールでAPRを使用している場合(つまり、Tomcatネイティブライブラリをインストールしている場合)、JSSE OpenSSL実装が使用され、それ以外の場合はJava JSSE実装が使用されます。

必要に応じて、実装の自動選択を回避できます。これは、Connectorprotocol属性にクラス名を指定することで行われます。

APRライブラリがロードされているかどうかに関係なく、Java(JSSE)コネクタを定義するには、次のいずれかを使用します。

<!-- Define an HTTP/1.1 Connector on port 8443, JSSE NIO implementation -->
<Connector protocol="org.apache.coyote.http11.Http11NioProtocol"
           sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation"
           port="8443" .../>

<!-- Define an HTTP/1.1 Connector on port 8443, JSSE NIO2 implementation -->
<Connector protocol="org.apache.coyote.http11.Http11Nio2Protocol"
           sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation"
           port="8443" .../>

OpenSSL JSSE実装も、必要に応じて明示的に構成できます。APRライブラリがインストールされている場合、sslImplementationName属性を使用すると有効にできます。OpenSSL JSSE実装を使用する場合、構成ではJSSE属性またはOpenSSL属性のいずれかを使用できますが、同じSSLHostConfigまたはConnector要素内で両方のタイプの属性を混在させてはなりません。

<!-- Define an HTTP/1.1 Connector on port 8443, JSSE NIO implementation and OpenSSL -->
<Connector protocol="org.apache.coyote.http11.Http11NioProtocol" port="8443"
           sslImplementationName="org.apache.tomcat.util.net.openssl.OpenSSLImplementation"
           .../>

JSSE OpenSSLを使用している場合は、OpenSSLの代替エンジンを構成するオプションがあります。

<Listener className="org.apache.catalina.core.AprLifecycleListener"
          SSLEngine="someengine" SSLRandomSeed="somedevice" />

デフォルト値は次のとおりです。

<Listener className="org.apache.catalina.core.AprLifecycleListener"
          SSLEngine="on" SSLRandomSeed="builtin" />

したがって、OpenSSLを有効にするには、SSLEngine属性がoff以外の値に設定されていることを確認してください。デフォルト値はonで、別の値を指定する場合は、有効なOpenSSLエンジン名である必要があります。

SSLRandomSeedを使用すると、エントロピーのソースを指定できます。本番システムには信頼できるエントロピーのソースが必要ですが、エントロピーを収集するには多くの時間が必要になる可能性があるため、テストシステムでは、Tomcatの起動を高速化するために"/dev/urandom"のようなブロッキングしないエントロピーソースを使用できます。

最後のステップは、$CATALINA_BASE/conf/server.xmlファイルでConnectorを構成することです。ここで、$CATALINA_BASEはTomcatインスタンスのベースディレクトリを表します。SSLコネクタの<Connector>要素の例は、Tomcatとともにインストールされるデフォルトのserver.xmlファイルに含まれています。JSSE構成スタイルでJSSEを使用するSSLコネクタを構成するには、コメントを削除し、次のように編集する必要があります。

<!-- Define an SSL Coyote HTTP/1.1 Connector on port 8443 -->
<Connector
    protocol="org.apache.coyote.http11.Http11NioProtocol"
    port="8443"
    maxThreads="150"
    SSLEnabled="true"
    maxParameterCount="1000"
    >
  <SSLHostConfig>
    <Certificate
      certificateKeystoreFile="${user.home}/.keystore"
      certificateKeystorePassword="changeit"
      type="RSA"
      />
    </SSLHostConfig>
</Connector>

注:tomcat-nativeがインストールされている場合、構成ではOpenSSL実装を備えたJSSEが使用されます。

APR構成スタイルでは、特にキーと証明書について、多くのSSL設定に異なる属性を使用します。APR構成スタイルの例を次に示します。

<!-- Define an SSL Coyote HTTP/1.1 Connector on port 8443 -->
<Connector
    protocol="org.apache.coyote.http11.Http11NioProtocol"
    port="8443"
    maxThreads="150"
    SSLEnabled="true"
    maxParameterCount="1000"
    >
  <SSLHostConfig>
    <Certificate
        certificateKeyFile="conf/localhost-rsa-key.pem"
        certificateFile="conf/localhost-rsa-cert.pem"
        certificateChainFile="conf/localhost-rsa-chain.pem"
        type="RSA"
        />
  </SSLHostConfig>
</Connector>

構成オプションと、どの属性が必須であるかについての情報は、HTTPコネクタ構成リファレンスのSSLサポートセクションに記載されています。Tomcatは、すべてのTLSコネクタでいずれかの構成スタイル(JSSEまたはOpenSSL)をサポートしています。

port属性は、Tomcatがセキュアな接続をリッスンするTCP/IPポート番号です。これを任意のポート番号(たとえば、https通信のデフォルトポートである443など)に変更できます。ただし、多くのオペレーティングシステムでは、1024未満のポート番号でTomcatを実行するには、特別な設定(このドキュメントの範囲外)が必要です。

ここでポート番号を変更する場合は、非SSLコネクタのredirectPort属性に指定された値も変更する必要があります。これにより、サーブレット仕様で要求されているように、SSLが必要であることを指定するセキュリティ制約のあるページにアクセスしようとするユーザーをTomcatが自動的にリダイレクトできます。

これらの構成変更が完了したら、通常どおりにTomcatを再起動すると、すべてが正常に動作するはずです。SSLを介してTomcatでサポートされている任意のWebアプリケーションにアクセスできるはずです。たとえば、試してみてください。

https://localhost:8443/

そして、通常のTomcatスプラッシュページが表示されるはずです(ROOT Webアプリケーションを変更していない場合)。これが機能しない場合は、次のセクションにトラブルシューティングのヒントが記載されています。

認証局からの証明書のインストール

認証局(verisign.com、thawte.com、trustcenter.deなど)から証明書を取得してインストールするには、前のセクションを読んでから、次の手順に従ってください。

ローカル証明書署名リクエスト(CSR)の作成

選択した認証局から証明書を取得するには、証明書署名要求(CSR)を作成する必要があります。このCSRは、認証局がWebサイトを「安全」として識別する証明書を作成するために使用されます。CSRを作成するには、次の手順に従います。

  • ローカルの自己署名証明書を作成します(前のセクションで説明したとおり)。
    keytool -genkey -alias tomcat -keyalg RSA
        -keystore <your_keystore_filename>
    注:場合によっては、動作する証明書を作成するために、「名と姓」フィールドにWebサイトのドメイン(つまり、www.myside.org)を入力する必要があります。
  • 次に、CSRは次のように作成されます。
    keytool -certreq -keyalg RSA -alias tomcat -file certreq.csr
        -keystore <your_keystore_filename>

これで、certreq.csrというファイルが作成されました。これを認証局に送信できます(これを行う方法については、認証局のWebサイトのドキュメントを参照してください)。代わりに、証明書を取得します。

証明書のインポート

証明書を入手したので、ローカルのキーストアにインポートできます。まず、いわゆるチェーン証明書またはルート証明書をキーストアにインポートする必要があります。その後、証明書のインポートに進むことができます。

  • 証明書を取得した認証局からチェーン証明書をダウンロードします。
    Verisign.comの商用証明書の場合は、http://www.verisign.com/support/install/intermediate.htmlにアクセスしてください。
    Verisign.comのトライアル証明書の場合は、http://www.verisign.com/support/verisign-intermediate-ca/Trial_Secure_Server_Root/index.htmlにアクセスしてください。
    Trustcenter.deの場合は、http://www.trustcenter.de/certservices/cacerts/en/en.htm#serverにアクセスしてください。
    Thawte.comの場合は、http://www.thawte.com/certs/trustmap.htmlにアクセスしてください。
  • チェーン証明書をキーストアにインポートします。
    keytool -import -alias root -keystore <your_keystore_filename>
        -trustcacerts -file <filename_of_the_chain_certificate>
  • そして最後に、新しい証明書をインポートします。
    keytool -import -alias tomcat -keystore <your_keystore_filename>
        -file <your_certificate_filename>

各認証局は、他の認証局とは少し異なる傾向があります。わずかに異なる情報が必要になったり、証明書と関連付けられた証明書チェーンを異なる形式で提供したりする場合があります。さらに、認証局が証明書を発行するために使用するルールは、時間の経過とともに変化します。その結果、上記のコマンドを変更する必要がある場合があります。支援が必要な場合は、Apache Tomcatユーザーメーリングリストから支援を受けることができます。

OCSP 証明書の使用

Apache TomcatでOnline Certificate Status Protocol(OCSP)を使用するには、Tomcatネイティブコネクタをダウンロード、インストール、構成したことを確認してください。さらに、Windowsプラットフォームを使用する場合は、OCSP対応のコネクタをダウンロードしてください。

OCSPを使用するには、以下が必要です。

  • OCSP対応の証明書
  • SSL APRコネクタを備えたTomcat
  • 構成されたOCSPレスポンダー

OCSP 対応証明書の生成

Apache Tomcatでは、証明書にOCSPレスポンダーの場所がエンコードされているOCSP対応証明書が必要です。openssl.cnfファイルの基本的なOCSP関連の認証局設定は、次のようになります。


#... omitted for brevity

[x509]
x509_extensions = v3_issued

[v3_issued]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
# The address of your responder
authorityInfoAccess = OCSP;URI:http://127.0.0.1:8088
keyUsage = critical,digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment,keyAgreement,keyCertSign,cRLSign,encipherOnly,decipherOnly
basicConstraints=critical,CA:FALSE
nsComment="Testing OCSP Certificate"

#... omitted for brevity

上記の設定では、OCSPレスポンダーのアドレス127.0.0.1:8088が証明書にエンコードされます。次の手順では、openssl.cnfとCAのその他の構成を準備しておく必要があることに注意してください。OCSP対応証明書を生成するには、次の手順を実行します。

  • 秘密鍵を作成します。
    openssl genrsa -aes256 -out ocsp-cert.key 4096
  • 署名要求(CSR)を作成します。
    openssl req -config openssl.cnf -new -sha256 \
      -key ocsp-cert.key -out ocsp-cert.csr
  • CSRに署名します。
    openssl ca -openssl.cnf -extensions ocsp -days 375 -notext \
      -md sha256 -in ocsp-cert.csr -out ocsp-cert.crt
  • 証明書を確認できます。
    openssl x509 -noout -text -in ocsp-cert.crt

トラブルシューティング

TLSハンドシェイクの失敗に関する追加情報を取得するには、次の行を$CATALINA_BASE/conf/logging.propertiesに追加して、専用のTLSハンドシェイクロガーがデバッグレベルのメッセージをログに記録するように構成します。

org.apache.tomcat.util.net.NioEndpoint.handshake.level=FINE
または
org.apache.tomcat.util.net.Nio2Endpoint.handshake.level=FINE
使用されているConnectorに応じて異なります。

SSL通信の設定時に発生する可能性のある一般的な問題と、それに対する対処法を次に示します。

  • Tomcatの起動時に、「java.io.FileNotFoundException: {some-directory}/{some-file} が見つかりません」のような例外が発生します。

    考えられる説明としては、Tomcatが検索しているキーストアファイルが見つからないことが挙げられます。デフォルトでは、TomcatはキーストアファイルがTomcatを実行しているユーザーのホームディレクトリ(自分のものであるかどうかは関係ありません :-))に.keystoreという名前で存在することを想定しています。キーストアファイルが他の場所にある場合は、Tomcat構成ファイル<Certificate>要素にcertificateKeystoreFile属性を追加する必要があります。

  • Tomcatの起動時に、「java.io.FileNotFoundException: Keystoreが改ざんされたか、パスワードが正しくありません」のような例外が発生します。

    誰かが実際にキーストアファイルを改ざんしていないと仮定すると、最も可能性の高い原因は、Tomcatがキーストアファイルの作成時に使用したパスワードとは異なるパスワードを使用していることです。これを修正するには、キーストアファイルを再作成するか、Tomcat構成ファイル<Connector>要素にkeystorePass属性を追加または更新することができます。注意 - パスワードは大文字と小文字が区別されます。

  • Tomcatの起動時に、「java.net.SocketException: SSL handshake error javax.net.ssl.SSLException: No available certificate or key corresponds to the SSL cipher suites which are enabled.」のような例外が発生します。

    考えられる説明としては、Tomcatが指定されたキーストア内のサーバーキーのエイリアスを見つけることができないことが挙げられます。Tomcat構成ファイル<Certificate>要素に、正しいcertificateKeystoreFilecertificateKeyAliasが指定されていることを確認してください。注意 - keyAliasの値は大文字と小文字が区別される場合があります。

それでも問題が解決しない場合は、TOMCAT-USERメーリングリストが役立ちます。このリストの以前のメッセージのアーカイブへのポインター、購読および購読解除の情報は、https://tomcat.dokyumento.jp/lists.htmlにあります。

アプリケーションでのセッショントラッキングに SSL を使用

これはServlet 3.0仕様の新機能です。物理的なクライアント/サーバー接続に関連付けられたSSLセッションIDを使用するため、いくつかの制限があります。

  • Tomcatには、属性isSecuretrueに設定されたコネクタが必要です。
  • SSL接続がプロキシまたはハードウェアアクセラレータによって管理されている場合は、SSLリクエストヘッダー(SSLValveを参照)を設定して、TomcatからSSLセッションIDが見えるようにする必要があります。
  • TomcatがSSL接続を終了した場合、SSLセッションIDは各ノードで異なるため、セッションレプリケーションを使用することはできません。

SSLセッショントラッキングを有効にするには、コンテキストのトラッキングモードをSSLのみに設定するコンテキストリスナーを使用する必要があります(他のトラッキングモードが有効になっている場合は、優先して使用されます)。次のように表示される場合があります。

package org.apache.tomcat.example;

import java.util.EnumSet;

import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletContextEvent;
import jakarta.servlet.ServletContextListener;
import jakarta.servlet.SessionTrackingMode;

public class SessionTrackingModeListener implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        // Do nothing
    }

    @Override
    public void contextInitialized(ServletContextEvent event) {
        ServletContext context = event.getServletContext();
        EnumSet<SessionTrackingMode> modes =
            EnumSet.of(SessionTrackingMode.SSL);

        context.setSessionTrackingModes(modes);
    }

}

その他のヒントと情報

リクエストからSSLセッションIDにアクセスするには、次を使用します。

String sslID = (String)request.getAttribute("jakarta.servlet.request.ssl_session_id");

この領域に関する追加の議論については、Bugzillaを参照してください。

SSLセッションを終了するには、次を使用します。

// Standard HTTP session invalidation
session.invalidate();

// Invalidate the SSL Session
org.apache.tomcat.util.net.SSLSessionManager mgr =
    (org.apache.tomcat.util.net.SSLSessionManager)
    request.getAttribute("jakarta.servlet.request.ssl_session_mgr");
mgr.invalidateSession();

// Close the connection since the SSL session will be active until the connection
// is closed
response.setHeader("Connection", "close");