【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は?
という場合は、申し訳ありませんが他の方の
記事を参考にすると良いと思います。
以上、ここまで読んで頂き、ありがとうございました。
この記事が気に入ったらサポートをしてみませんか?