【Tomcat9】SSLアクセスをさせる時のポイント(apache使用)

※この記事に記載している内容は
https://note.com/yone3_note/n/n3108c57aabb8
で紹介している環境で試したものです。

【最初に】

CentOS7にTomcat9をインストールして
HTTPSでアクセス可能にさせる方法についてです。

色々やってみて私なりに理解できたことが
以下になるのですが、簡単に言うとこんな感じです

A.Tomcat単体(apache等Webサーバを使わない)で
 SSL化するにはjks形式の証明書が必要で
 tomcat側(server.xml)に証明書の設定をする必要がある

B.apache+tomcat構成にするなら、apache側で
openssl等を使いサーバ証明書が発行できていれば
tomcat側でSSLの設定は不要(プロトコルの設定は必要)

私は、最初AもBも両方設定が必要だと勘違いして
色々模索していたのですが、apache側がHTTPSで受けて
tomcatに「secure=true」や「scheme=https」等
設定してあげれば、証明書の設定はいらなさそうです。

具体的な例を下記に記載します。

【A.証明書の設定をtomcatにする場合】

予め、jks形式の証明書を作る必要があるので

keytool -genkey -alias tomcat -keyalg RSA -keystore keystore.jks -validity 36500

などで証明書を作ります。その後、証明書ファイルを適切な場所に配置し

<Connector
   port="8443"
   protocol="org.apache.coyote.http11.Http11NioProtocol"
   maxThreads="150"
   SSLEnabled="true"
       <SSLHostConfig>
           <Certificate
               certificateKeystoreFile="xxxx/keystore.jks" # 証明書のファイルパス
               certificateKeystorePassword="changeit"      # 証明書作成時のパスワード
               certificateKeyAlias="tomcat"                # 証明書作成時のエイリアス名
               certificateKeystoreProvider="SUN"           # 証明書作成時のプロバイダ(作った証明書の中を見れば分かる)
               certificateKeystoreType="PKCS12"            # 証明書のキーストアタイプ(これも中身見ればわかるはず)
       </SSLHostConfig>
</Connector>

のように設定します。tomcat単体で動かす場合はこうなります。
この後、「https://{サーバのIP or ホスト名}:8443/{アプリケーションルート}」
でhttpsアクセスできるはずです。

以下、設定時に私が躓いたポイント

・tomcatのプロトコルは
「org.apache.coyote.http11.Http11NioProtocol」
じゃないと起動時にエラーが出ることがある
「org.apache.coyote.http11.Http11AprProtocol」
というのもあるが、これは商用利用のための
プロトコルらしく、証明書の内容次第で
エラーになる(?)らしい。詳しくは他で調べて見てください。

・ポート「8443」のポート開放を忘れていたので
何回設定変えてもhttpステータス403が返ってくる
(tomcatの設定ミスを疑って、何度もxml書き換えたけど
単にファイアウォールで弾かれてるだけでした・・・ウカツ)

・Tomcatのバージョンによっては「<SSLHostConfig>」セクションが
必要なこと(Tomcat8以降は必要みたいです)

【B.証明書の設定をapache側でする場合】

ここでapacheのSSL化について書きだすと長くなりそうなので
(もう十分長い記事になっちゃってますが・・・)
apacheのSSL化については割愛します。
SSL設定した上で

<Location "/tomcat-app-root">
   ProxyPass        ajp://localhost:8443/tomcat-app-root
   ProxyPassReverse ajp://localhost:8443/tomcat-app-root
</Location>

こんな感じで設定してあげます。(mod_proxy.soは使えてる前提です)

設定ポイントとしては、
まず、設定セクションは「Location」にすること。
私はよく「Directory」を使うのですが
これはapacheのドキュメントルート配下にパスが存在している時です。
今回、tomcatのインストール先はapacheとは別の場所にしており
且つ、Webアプリケーションルートもtomcatインストールパス配下にある「webapps」ディレクトリを使っているため、あくまでURLの
ロケーション設定を使います。

次のポイントはProxyPass、ProxyPassReverseを使うこと。
単にapache⇒tomcatへ連携するだけならProxyPassだけでも良いですが
アプリケーション側からリダイレクトすること等はよくある話ですので
そのためにProxyPassReverseも入れておきます。

私は他の要件もあったので、上記のような設定にしていますが

ProxyPass        /tomcat-app-root ajp://localhost:8443/tomcat-app-root
ProxyPassReverse /tomcat-app-root ajp://localhost:8443/tomcat-app-root

みたいな設定も可能です。

【まとめ】

いかがだったでしょうか?
SSLが標準化されている現在では、tomcatでWebアプリを
動かす際にもhttpsにしないとブラウザが警告をだしてしまいます。
(ブラウザによっては弾かれることも)

そういったことを防ぐためのSSL化設定ですが
・tomcat単体で設定する場合
・apache+tomcat連携で設定する場合
の2種類を紹介しました。Nginxの時は?Jettyは?
という場合は、申し訳ありませんが他の方の
記事を参考にすると良いと思います。

以上、ここまで読んで頂き、ありがとうございました。


この記事が気に入ったらサポートをしてみませんか?