SSL属性

  • Tomcat Version:8.5.23

SSL/TLSプロトコルによって提供されるセキュアな接続の上でHTTP通信を行うHTTPS通信を有効にする方法について説明します。

デフォルトのHTTPS設定

SSLの設定は、conf/server.xmlファイルにデフォルト値としてコメントアウトされた状態で定義されています。
コメントアウトを解除する前にConnector要素に明示された各要素を確認して作業して下さい。
上段の設定がHTTP/1.1にSSLを適用したデフォルト値、下段の設定がHTTP/2.0を適用した上でSSLを適用したデフォルト値です。

server.xmlのSSL設定箇所-HTTP/1.1利用時
    <!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443
         This connector uses the NIO implementation. The default
         SSLImplementation will depend on the presence of the APR/native
         library and the useOpenSSL attribute of the
         AprLifecycleListener.
         Either JSSE or OpenSSL style configuration may be used regardless of
         the SSLImplementation selected. JSSE style configuration is used below.
    -->
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" >
               maxThreads="150" SSLEnabled="true">
        <SSLHostConfig>
            <Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
                         type="RSA" />
        </SSLHostConfig>
    </Connector>

					
server.xmlのSSL設定箇所-HTTP/2.0利用時
    <!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2
         This connector uses the APR/native implementation which always uses
         OpenSSL for TLS.
         Either JSSE or OpenSSL style configuration may be used. OpenSSL style
         configuration is used below.
    -->
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
               maxThreads="150" SSLEnabled="true" >
        <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
        <SSLHostConfig>
            <Certificate certificateKeyFile="conf/localhost-rsa-key.pem"
                         certificateFile="conf/localhost-rsa-cert.pem"
                         certificateChainFile="conf/localhost-rsa-chain.pem"
                         type="RSA" />
        </SSLHostConfig>
    </Connector>
					

SSLHostConfigタグの説明

最初にTomcat 9で実装され、8.5にバックポートされたTomcatは、現在、Server Name Indication(SNI)をサポートしています。
これにより、クライアントが要求したホスト名で決定された任意の接続に使用される構成で、
複数のSSL構成を1つのセキュア・コネクターに関連付けることができます。
これを容易にするために、これらの設定の1つを定義するために使用できるSSLHostConfig要素が追加されました。

任意の数のSSLHostConfigをコネクタにネストすることができます。
同時に、複数の証明書が単一のSSLHostConfigに関連付けられるようにサポートが追加されました。
したがって、各SSL証明書は、SSLHostConfigを使用してCertificate要素内で構成されます。

ConnectorのSSLサポート

コネクタの特定のインスタンスに対してSSLサポートを有効にするには、SSLEnabled属性をtrueに設定します。

サーブレットに正しい情報を渡すために、scheme属性に「https」をsecure属性に「true」を設定する必要があります。

NIOおよびNIO2コネクタは、JSSE Java SSL実装またはOpenSSL実装を使用しますが、
APR/ネイティブコネクタはOpenSSLのみを使用します。 Tomcat 8.5より前は、JSSEとOpenSSLで異なる設定属性が使用されていました。
Tomcat 8.5以降では、JSSEとOpenSSLの両方に共通の設定属性が使用されています。
また、JSSE OpenSSL実装を使用する場合は、JSSE属性またはAPR属性を使用して設定を行うことができます(ただし、同じ設定内の両方の型ではありません)。
これは、SSLコネクターのコネクター実装を簡単に切り替えるのを助けるためです。

各セキュアコネクタは、少なくとも1つのSSLHostConfigを定義する必要があります。
SSLHostConfig要素の名前は一意である必要があり、そのうちの1つがコネクタのdefaultSSLHostConfigName属性と一致する必要があります。

各SSLHostConfigは少なくとも1つの証明書を定義する必要があります。証明書のタイプは一意でなければなりません。

Tomcat 8.5以降、ConnectorのSSL構成属性の大部分は推奨されなくなりました。
指定されている場合は、defaultSSLHostConfigNameのSSLHostConfigと証明書を設定するために使用されます。
明示的なSSLHostConfig要素がdefaultSSLHostConfigNameにも存在する場合、それは構成エラーとして扱われることに注意してください。
Tomcat 10は、コネクター内のSSL構成属性のサポートを廃止する予定です。

更に詳しい詳細情報は、「SSL Configuration HOW-TO.」をご確認下さい。

SSLHostConfigタグの属性

属性 8.5系デフォルト値 説明
certificateRevocationFile 8.5系設定不可 証明機関の連結失効リストを含むファイルの名前。フォーマットはPEMエンコードされています。
定義されていない場合、クライアント証明書は証明書失効リストに対してチェックされません。
(OpenSSLベースのコネクタが使用され、certificateRevocationPath属性が定義されていない場合)。
相対パスは$CATALINA_BASEに対して解決されます。
JSSEベースのコネクターは、この属性のURLも指定できます。
certificateRevocationPath 8.5系設定不可 OpenSSL のみ。
証明機関の証明書失効リストを含むディレクトリの名前。フォーマットはPEMエンコードされています。相対パスは$ CATALINA_BASEに対して解決されます。
certificateVerification none 接続を受け入れる前にSSLスタックにクライアントからの有効な証明書チェーンが必要になるようにするには、「required」(必須)に設定します。
SSLスタックがクライアント証明書を要求し、提示されていない場合は失敗しないようにするには、「option」に設定します。
クライアント証明書をオプションにし、Tomcatが信頼できるCAのリストに対してそれらをチェックしないようにするには、「optionalNoCA 」に設定します。
TLSプロバイダがこのオプションをサポートしていない場合(OpenSSLは、JSSEはサポートしていません)、オプションが指定されているかのように扱われます。
クライアントがCLIENT-CERT認証を使用するセキュリティ制約によって保護されたリソースを要求しない限り、「none」(デフォルト値)は証明書チェーンを必要としません。
certificateVerificationDepth 10 クライアント証明書の検証時に許可される中間証明書の最大数。
caCertificateFile null OpenSSL のみ。
信頼できる認証局の連結証明書を含むファイルの名前。フォーマットはPEMエンコードされています。
caCertificatePath null OpenSSL のみ。
信頼できる認証局の証明書を含むディレクトリーの名前。フォーマットはPEMエンコードされています。
ciphers null 暗号はOpenSSL構文を使用して有効にします。 (サポートされている暗号のリストと構文については、OpenSSLのマニュアルを参照してください)。
代わりに、標準のOpenSSL暗号名または標準のJSSE暗号名を使用する暗号のコンマ区切りリストを使用することもできます。
OpenSSL構文からJSSEベースのコネクタ用のJSSE暗号に変換するとき、OpenSSL構文解析の動作は、OpenSSL 1.1.0開発ブランチの動作に合わせて維持されます。
SSL実装でサポートされている暗号だけが使用されます。
指定されていない場合、「HIGH:!anull:!enull:!EXPORT:!DES:!RC4:!MD5:!kRSA」のデフォルト(OpenSSL表記を使用)が使用されます。
デフォルトでは、暗号が定義されている順序は優先順位として扱われます。 honorCipherOrderを参照してください。
disableCompression true OpenSSL のみ。
圧縮が無効になっているかどうかを設定します。
使用するOpenSSLバージョンが圧縮を無効にすることをサポートしていない場合、そのOpenSSLバージョンのデフォルトが使用されます。
disableSessionTickets false OpenSSL のみ。
trueに設定すると、TLSセッションチケット(RFC 5077)の使用を無効にします。
TLSセッションチケットが使用されている場合、完全ピア証明書チェーンは最初の接続でのみ使用可能になります。
後続の接続(チケットを使用してTLSセッションを解放する)には、完全なチェーンではなく、ピア証明書だけがあります。
honorCipherOrder null クライアントに暗号を選択させるのではなく、(暗号設定による)サーバーの暗号順序を強制するには、trueに設定します。
この機能を使用するには、Java 8以降が必要です。
hostName _default_ SSLホストの名前。これは、完全修飾ドメイン名(例:tomcat.apache.org)または
ワイルドカードドメイン名(例:* .apache.org)のいずれかでなければなりません。
insecureRenegotiation false OpenSSL のみ。
安全でない再ネゴシエーションが許可されているかどうかを設定します。
安全でない再ネゴシエーションが許可されている場合、使用されているOpenSSLバージョンが設定をサポートしていない場合、
そのOpenSSLバージョンのデフォルトが使用されます。
keyManagerAlgorithm ※1. JSSE のみ。
使用するKeyManagerアルゴリズム。インストールしたJVMによってその値が異なります。
Oracle社からJavaSEをインストールした場合には、「Sun JVM」を意味する「SunX509」が設定されています。
IBM社のJVMは「IbmX509」を返します。他ベンダーは、JVMのマニュアルをご参照下さい。
※1.デフォルト値は、インストールしたJREの「%JRE_HOME%¥lib¥security¥java.security」に定義されています。
(L.311) ssl.KeyManagerFactory.algorithm=SunX509で定義された値がデフォルト値として読み取られます。
上記java.securityに設定されていない場合には、Tomcatはデフォルト値として「SunX509」を設定します。
protocols all クライアントと通信するときにサポートするプロトコルの名前。これは、次のいずれかの組み合わせのリストである必要があります。
  • SSLv2Hello
  • SSLv3
  • TLSv1
  • TLSv1.1
  • TLSv1.2
  • all
リスト内の各トークンには、プラス記号「+」またはマイナス記号「-」を前置することができます。
プラス記号はプロトコルを追加し、マイナス記号は現在のプロトコルのリストから削除します。
トークンallは、SSLv2Hello、TLSv1、TLSv1.1、TLSv1.2の別名です。

SSLv2HelloはOpenSSLベースのセキュアコネクタでは無視されることに注意してください。
OpenSSLベースのセキュアコネクタに複数のプロトコルが指定されている場合、SSLv2Helloを常にサポートします。
単一のプロトコルが指定されている場合、SSLv2Helloはサポートされません。

SSLv2とSSLv3は本質的に危険であることに注意してください。
(筆者記)区切り文字「,」(カンマ)で複数定義できます。「+」と同義です。
例)TLSv1,TLSv1.1,TLSv1.2
revocationEnabled false JSSE のみ。
JSSEプロバイダは証明書失効チェックを有効にする必要性の有無。(ture:有効 false:無効)
certificateRevocationListFileが設定されている場合、この属性は無視され、失効チェックは常に有効になります。
この属性は、他の手段を介して現在のJSSEプロバイダに対して構成された取り消しチェックを有効にすることを目的としています。
sessionCacheSize 0 JSSE のみ。
セッションキャッシュに保持するSSLセッションの数。
0を指定した場合、無制限のキャッシュ・サイズを意味します。
sessionTimeout 86400 JSSE のみ。
SSLセッションの作成後タイムアウトになる秒単位の時間。
0を指定した場合、タイムアウトの制限時間はありません。デフォルト値は24時間を意味します。
sslProtocol TLS JSSE のみ。
使用するSSLプロトコル(単一の値で複数のプロトコルを有効にすることができます - 詳細はJVMのドキュメントを参照)。
SSLContextインスタンスの作成時に許容される値は、アルゴリズムの許容値についてJVMのドキュメントから取得できます。
Oracle Java 7注:この属性とプロトコルは重複しています。
trustManagerClassName null JSSE のみ。
クライアント証明書の検証に使用するカスタムのTrustManagerクラスの名前。
クラスには引数なしのコンストラクタが必要で、javax.net.ssl.X509TrustManagerも実装する必要があります。
この属性が設定されている場合、trust store の属性は無視されます。
truststoreAlgorithm TrustManagerFactory.
getDefaultAlgorithm()
JSSE のみ。
トラストストアに使用するアルゴリズム。
指定しない場合、javax.net.ssl.TrustManagerFactory.getDefaultAlgorithm()によって返されるデフォルト値が使用されます。
(筆者追記)%JRE_HOME%\yen;lib\yen;java.securityファイルのL.312
ssl.TrustManagerFactory.algorithm=PKIX
がデフォルトとして適用されます。
truststoreFile System.getProperty
("javax.net.ssl.trustStore")
JSSE のみ。
クライアント証明書の検証に使用する証明書ファイル(trustStore File)。
デフォルトは、javax.net.ssl.trustStoreシステム・プロパティーの値です。
この属性も既定のシステムプロパティも設定されていない場合、信頼ストアは構成されません。
相対パスは$CATALINA_BASEに対して解決されます。この属性にURLを使用することもできます。
(筆者記)$CATALINA_BASE¥bin\¥setenv.batに set "CATALINA_OPTS=-D他のオプション -Djavax.net.ssl.trustStore=conf/ssl/certs/作成した証明書ファイル"
形式で明記します。※.ディレクトリは$CATALINA_BASE配下であれば任意のディレクトリで構成して下さい。 truststorePassword,truststoreProvider,truststoreType属性も同様に-Dプロパティ名=値 形式で指定します。
truststorePassword System.getProperty
("javax.net.ssl.trustStorePassword")
JSSE のみ。
証明書(trustStore)にアクセスするためのパスワード
デフォルトは、javax.net.ssl.trustStorePasswordシステム・プロパティーの値です。
そのプロパティがnullの場合、トラストストアのパスワードは設定されません。
無効なトラストストアパスワードが指定されている場合、警告が記録され、
トラストストアの内容の検証をスキップするパスワードなしでトラストストアにアクセスしようとします。
truststoreProvider System.getProperty
("javax.net.ssl.trustStoreProvider")
JSSE のみ。
サーバー証明書に使用されるトラストストアプロバイダの名前。
デフォルトは、javax.net.ssl.trustStoreProviderシステム・プロパティーの値です。
そのプロパティがnullの場合、keystoreProviderの値がデフォルトとして使用されます。
この属性及びデフォルトのシステムプロパティもkeystoreProviderも設定されていない場合、
登録されたプロバイダのリストは優先順位順にトラバースされ、
truststoreTypeをサポートする最初のプロバイダが使用されます。
truststoreType System.getProperty
("javax.net.ssl.trustStoreType")
JSSE のみ。
トラストストアに使用されるキーストアのタイプ。
デフォルトは、javax.net.ssl.trustStoreTypeシステム・プロパティーの値です。
このTLS仮想ホストに対して1つの証明書が構成され、その証明書にPKCS12ではないkeystoreTypeがある場合、
デフォルトは単一の証明書のkeystoreTypeになります。
これらのどれもデフォルトを指定しない場合、デフォルトはJKSになります。

SSLサポート - 証明書

属性 8.5系デフォルト値 説明
certificateFile null サーバー証明書を含むファイルの名前。
フォーマットはPEMエンコードされています。相対パスは$CATALINA_BASEに対して解決されます。
証明書に加えて、ファイルには、オプションの要素として、
それぞれ、openssl dhparamおよびopenssl ecparamによって生成された、
一時的なキーのDHパラメータおよび/またはECカーブネームを含めることもできます。
それぞれのOpenSSLコマンドの出力は、単に証明書ファイルに連結することができます。
certificateChainFile null 使用されるサーバー証明書に関連付けられた証明書チェーンを含むファイルの名前。
フォーマットはPEMエンコードされています。相対パスは$CATALINA_BASEに対して解決されます。

Tomcatに使用される証明書チェーンは、最初の要素としてサーバー証明書を含めるべきではありません。

異なるタイプに複数の証明書を使用する場合は、すべてが同じ証明書チェーンを使用する必要があることに注意してください。
certificateKeyAlias null JSSEのみ。
キーストアのサーバーキーと証明書に使用されるエイリアス指定しない場合、
キーストアから読み取られた最初のキーが使用されます。
キーストアからキーが読み込まれる順序は実装によって異なります。
キーが追加されたのと同じ順序でキーストアから読み取られることはありません。
キーストアに複数のキーが存在する場合は、正しいキーが使用されるようにkeyAliasを構成することを強くお勧めします。
certificateKeyFile null JSSEのみ。
サーバーの秘密鍵を含むファイルの名前。
フォーマットはPEMエンコードされています。
デフォルト値はcertificateFileの値です。(※.筆者追記)certificateKeyFileがnullの場合には、certificateFileの設定値がデフォルト値として設定されます。
この場合、証明書と秘密鍵の両方がこのファイルになければなりません(RECOMMENDEDではありません)。
相対パスは$CATALINA_BASEに対して解決されます。
certificateKeyPassword null JSSEのみ。
指定されたファイルからサーバー証明書に関連付けられた秘密鍵にアクセスするために使用されるパスワード。
指定しない場合、JSSEのデフォルトの動作では、certificateKeystorePasswordを使用します。
OpenSSLでは、デフォルトの動作ではパスワードを使用しません。
certificateKeystoreFile ※.1 JSSEのみ。
サーバー証明書とロードするキーを格納しているキーストアファイルのパス名。
デフォルトでは、パス名はTomcatを実行しているユーザーのオペレーティングシステムのホームディレクトリにある.keystoreファイルです。
※.1) System.getProperty("user.home")+"/.keystore"
keystoreTypeがファイルを必要としない場合は、このパラメータに ""(空文字列)または「NONE」を使用します。
相対パスは$CATALINA_BASEに対して解決されます。この属性にURLを使用することもできます。
certificateKeystorePassword changeit JSSEのみ。
サーバーの秘密鍵と証明書を含むキーストアへのアクセスに使用するパスワード。
certificateKeystoreProvider System.getProperty
("javax.net.ssl.keyStoreProvider")
JSSEのみ。
サーバー証明書に使用されるキーストアプロバイダの名前。
指定しない場合は、システムプロパティjavax.net.ssl.keyStoreProviderの値が使用されます。
この属性もシステムプロパティも設定されていない場合、
登録されたプロバイダのリストは優先順位順にトラバースされ、
keystoreTypeをサポートする最初のプロバイダが使用されます。
certificateKeystoreType System.getProperty
("javax.net.ssl.keyStoreType", "JKS")
JSSEのみ。
サーバー証明書に使用するキーストアファイルの種類。
指定しない場合は、システムプロパティjavax.net.ssl.keyStoreTypeの値が使用されます。
この属性もシステムプロパティも設定されていない場合、デフォルト値は "JKS"です。
type System.getProperty
null
JSSEのみ。
サーバー証明書の種類。
証明症と互換性のある暗号を特定するために利用します。
この値は、「UNDEFINED」,「RSA」,「DSS」,「EC」の何れかを設定します。
1つの証明書だけがSSLHostConfig内にネストされている場合、
この属性は必須ではなく、デフォルトではUNDEFINEDになります。
SSLHostConfig内に複数の証明書がネストされている場合、
この属性は必須であり、各証明書には一意のタイプが必要です。

NIO及びNIO2固有属性

APR/ネイティブが有効になっている場合、コネクタはデフォルトでJSSE経由のOpenSSLを使用します。
使用されるプロセッサによってはJSSE Java実装よりも最適化され、多くの市販のアクセラレータコンポーネントで補完できます。

次のNIOおよびNIO2 SSL構成属性は、仮想ホストに固有のものではないため、コネクタで構成する必要があります。

属性 8.5系デフォルト値 説明
certificateFile 65536(64KB) SNIサポートを実装するために、Tomcatは新しいTLS接続(クライアントhello)で受信した
最初のTLSメッセージを解析して、要求されたサーバ名を抽出する必要があります。
メッセージはバッファリングされる必要があるため、通常のTLS処理のためにJSSE実装に渡すことができます。
理論的には、この最初のメッセージは非常に大きくなる可能性がありますが、実際には通常数百バイトです。
この属性は、Tomcatがバッファする最大メッセージサイズ(バイト単位)を設定します。
メッセージがこのサイズを超えると、クライアントによってサーバー名が指定されていないかのように接続が構成されます。
sslImplementationName null 使用するSSL実装のクラス名。
属性が指定されておらず、tomcat-nativeライブラリがインストールされていない場合は、
JVMのデフォルトJSSEプロバイダをラップするorg.apache.tomcat.util.net.jsse.JSSEImplementationが使用されます。
JVMは、デフォルトとは異なるJSSEプロバイダを使用するように設定できます。
Tomcatはまた、OpenSSLに裏打ちされたJSSE用の特別なSSL実装もバンドルしています。
これを有効にするには、ネイティブライブラリをAPRコネクタを使用するかのように有効にする必要があります。
Tomcatは自動的に有効にし、この属性のデフォルト値はorg.apache.tomcat.util.net.openssl.OpenSSLImplementationになります。
この場合、2つの型が混在していない限り、JSSEとOpenSSLの設定スタイルのいずれかの属性を使用することができます
(たとえば、Javaキーストアの使用を定義したり、 OpenSSL属性)。

NIO及びNIO2の廃止予定属性

次のNIOおよびNIO2 SSL構成属性は、デフォルトのSSLHostConfig要素を使用して非推奨になりました。

属性 代替属性(SSLHostConfig属性)
algorithm keyManagerAlgorithm
ciphers ciphers
clientAuth certificateVerification
crlFile certificateKeyAlias
keyPass certificateKeyPassword
keystoreFile certificateKeystoreFile
keystorePass certificateKeystorePassword
keystoreProvider certificateKeystoreProvider
keystoreType certificateKeystoreType
sessionCacheSize sessionCacheSize
sessionTimeout sessionTimeout
sslEnabledProtocols protocols
sslProtocol sslProtocol
trustManagerClassName trustManagerClassName
trustMaxCertLength certificateVerificationDepth
truststoreAlgorithm truststoreAlgorithm
truststoreFile truststoreFile
truststorePass truststorePassword
truststoreProvider truststoreProvider
truststoreType truststoreType
truststoreType useServerCipherSuitesOrder

APR/Native属性(廃止予定)

属性 代替属性(SSLHostConfig属性)
SSLCACertificateFile caCertificateFile
SSLCACertificatePath caCertificatePath
SSLCARevocationFile certificateRevocationFile
SSLCARevocationPath certificateRevocationPath
SSLCertificateFile certificateFile
SSLCertificateKeyFile certificateKeyFile
SSLCipherSuite ciphers
SSLDisableCompression disableCompression
SSLHonorCipherOrder honorCipherOrder
SSLPassword certificateKeyPassword
SSLProtocol protocols
SSLVerifyClient certificateVerification
SSLVerifyDepth certificateVerificationDepth
SSLDisableSessionTickets disableSessionTickets

コネクターの違い

(筆者記)この一覧表にコネクターの特徴が集約されています。

NIO:Java Nio Connector NIO2:Java Nio2 Connector APR:APR/native Connector

  NIO NIO2 APR
ClassName Http11NioProtocol Http11Nio2Protocol Http11AprProtocol
Tomcat Version 6.x onwards 8.x onwards 5.5.x onwards
Support Polling YES YES YES
Polling Size maxConnections maxConnections maxConnections
Read Request Headers Non Blocking Non Blocking Non Blocking
Read Request Body Blocking Blocking Blocking
Write Response Headers and Bod Blocking Blocking Blocking
Wait for next Request NON Blocking NON Blocking NON Blocking
SSL Support Java SSL or OpenSSL Java SSL or OpenSSL OpenSSL
SSL Handshake Non blocking Non blocking Blocking
Max Connections maxConnections maxConnections maxConnections

参考文献と参考になる資料