テックブログ

TomcatのSSL設定をしてみる

こんにちは。ネットアシスト技術部のKimです。
先日、Tomcat(トムキャット)のSSL設定に触れる機会がありましたので、今回のブログでまとめようと思います。

Tomcatについて

Tomcatは、プログラミング言語であるJava(ジャバ)を動かすためのCatalina(カタリナ)、
ウェブサイトを動かすためのCoyote(コヨーテ)をセットにしたソフトウェアです。
ウェブサーバーを動かす際は、Apache(アパッチ)というソフトを使うのが1つの主流ですが、
今回はTomcatでウェブサーバーを作成し、そのSSL設定を試してみます。

キーストアファイルについて

TomcatのSSL設定で要になるのは、キーストアファイルです。後述しますが、SSL設定をしたいドメインをはじめ、様々な情報を指定して作成します。
さらに、対象ドメインのサーバー証明書・中間証明書・秘密鍵をひとまとめにしたファイルを作成し、
キーストアファイルに入れます。
ややこしいですが、入れ子のようなイメージです。

Tomcat SSL設定

今回は以下の環境でTomcatのSSL設定を試します。
Java、Tomcatをインストールし、テスト用に用意したドメインで、
Tomcatのテストページ(画像.1)にアクセスできる状態からスタートします。
SSL証明書はLet’s Encryptで取得しました。
このテストページにおいて、HTTPS、8443ポートでアクセスが出来れば設定完了です。

・CentOS 7系
・Java 19系
・Tomcat 10系

[root@test ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

[root@test src]# java -version
java version "19.0.2" 2023-01-17
Java(TM) SE Runtime Environment (build 19.0.2+7-44)
Java HotSpot(TM) 64-Bit Server VM (build 19.0.2+7-44, mixed mode, sharing)

[root@test tomcat]# /usr/local/tomcat/bin/version.sh
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/lib/jvm/jdk-19-oracle-x64
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Server version: Apache Tomcat/10.1.5
Server built:   Jan 9 2023 19:52:50 UTC
Server number:  10.1.5.0
OS Name:        Linux
OS Version:     3.10.0-1160.15.2.el7.x86_64
Architecture:   amd64
JVM Version:    19.0.2+7-44
JVM Vendor:     Oracle Corporation
画像.1

キーストアファイル作成

はじめに、キーストアファイルの作成です。
キーストアファイル用のディレクトリを/usr/local/tomcat/配下に作成、そのディレクトリ内にキーストアファイルを作ります。
ファイル作成時には、任意のパスワードやSSLを設定するドメイン名、組織名、国名の入力が求められます。
最後に入力した内容が確認のために表示され、問題が無ければ”Y”を入力します。
”Generating ~”と出力されれば、作成完了です。
※今回はテストのため、組織名は省略しています。

[root@test tomcat]# mkdir /usr/local/tomcat/keystore
[root@test tomcat]# cd /usr/local/tomcat/keystore
[root@test keystore]# keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -validity 90 -ext SAN=dns:ドメイン名,ip:IPアドレス -keystore ファイル名.keystore
Enter keystore password:
Re-enter new password:
Enter the distinguished name. Provide a single dot (.) to leave a sub-component empty or press ENTER to use the default value in braces.
What is your first and last name?
  [Unknown]:  ドメイン名
What is the name of your organizational unit?
  [Unknown]:
What is the name of your organization?
  [Unknown]:
What is the name of your City or Locality?
  [Unknown]:  Japan
What is the name of your State or Province?
  [Unknown]:  Tokyo
What is the two-letter country code for this unit?
  [Unknown]:  JP
Is CN=ドメイン名, OU=Unknown, O=Unknown, L=Japan, ST=Tokyo, C=JP correct?
  [no]:  Y

Generating 2,048 bit RSA key pair and self-signed certificate (SHA384withRSA) with a validity of 90 days
        for: CN=ドメイン名, OU=Unknown, O=Unknown, L=Japan, ST=Tokyo, C=JP

キーストアファイルに入れるファイル作成・インポート

次にサーバー証明書・中間証明書・秘密鍵をひとまとめにしたファイルを作成します。ファイルの形式は、PKCS12を用います。この時は、任意のパスワードのみ、入力を求められます。
そして、キーストアファイルにPKCS12ファイルをインポートします。
“Enter destination keystore password”はキーストアファイル作成時、
“Enter source keystore password”にはPKCS12ファイルを作成した時に設定したパスワードを入力します。
最後の”Existing entry alias tomcat exists, overwrite?”で”Y”と入力すれば、インポート完了です。

[root@test keystore]# openssl pkcs12 -export -in /etc/letsencrypt/archive/ドメイン名/cert1.pem -inkey /etc/letsencrypt/archive/ドメイン名/privkey1.pem -certfile /etc/letsencrypt/archive/ドメイン名/chain1.pem -out ファイル名.p12 -name tomcat
Enter Export Password:
Verifying - Enter Export Password:

[root@test keystore]# keytool -importkeystore -srckeystore ファイル名.p12 -srcstoretype PKCS12 -destkeystore ファイル名.keystore -deststoretype JKS -alias tomcat
Importing keystore ファイル名.p12 to ファイル名.keystore...
Enter destination keystore password:
Enter source keystore password:
Existing entry alias tomcat exists, overwrite? [no]:  Y

設定ファイル編集

最後に、Tomcatの設定ファイルで”Connector port”という箇所を編集します。
設定ファイルには、他に書かれている内容がありますが、便宜上、初期設定から変更した部分だけ記載します。
“Certificate certificateKeystoreFile”で、先ほど作成したキーストアファイルのパスを設定します。
とりわけ 、443ポートが空いていないため、scheme=”https” を設定しないとHTTPS通信が出来ません。
また、初期状態の Connector port=”8443″ の部分は <!– –> で括られていることで、設定は無効化されています。これを消すことで、TomcatのSSL設定に必要な8443ポートを開けられます。

[root@test ~]# cat /usr/local/tomcat/conf/server.xml
    <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
               connectionTimeout="20000"
               redirectPort="8443" />

    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS">
        <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
        <SSLHostConfig>
            <Certificate certificateKeystoreFile="/usr/local/tomcat/keystore/ファイル名.keystore"
                         certificateKeystorePassword="キーストアファイルのパスワード"
                         certificateKeyAlias="tomcat"
                         certificateKeystoreType="PKCS12"
                         type="RSA" />
        </SSLHostConfig>
    </Connector>

Tomcat再起動

Tomcatを再起動し、書き換えた設定ファイルを読み込ませます。
再起動後、netstatコマンドで確認すると8443ポートが開いています。
ブラウザからも、HTTPS、8443ポートでテストページにアクセスできましたので、SSL設定は完了です(画像.2)。

[root@test keystore]# netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      540/rpcbind
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1266/sshd
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1099/master
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      2191/java
tcp6       0      0 :::111                  :::*                    LISTEN      540/rpcbind
tcp6       0      0 :::8080                 :::*                    LISTEN      2191/java
tcp6       0      0 :::22                   :::*                    LISTEN      1266/sshd
tcp6       0      0 ::1:25                  :::*                    LISTEN      1099/master

[root@test keystore]# systemctl status tomcat
● tomcat.service - Apache Tomcat 10
   Loaded: loaded (/etc/systemd/system/tomcat.service; disabled; vendor preset: disabled)
   Active: active (running) since Wed 2023-02-22 20:40:50 UTC; 29min ago
  Process: 2177 ExecStart=/usr/local/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 2191 (java)
   CGroup: /system.slice/tomcat.service
           mq2191 /usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apa...

Feb 22 20:40:50 test.ap-northeast-1.compute.internal systemd[1]: [/etc/systemd/system/tomcat.service:12] Unknown lvalue 'ExecRe...ice'
Feb 22 20:40:50 test.ap-northeast-1.compute.internal systemd[1]: Starting Apache Tomcat 10...
Feb 22 20:40:50 test.ap-northeast-1.compute.internal systemd[1]: Started Apache Tomcat 10.
Hint: Some lines were ellipsized, use -l to show in full.
[root@test keystore]#
[root@test keystore]# systemctl stop tomcat
[root@test keystore]#
[root@test keystore]# systemctl start tomcat
[root@test keystore]#
[root@test keystore]# systemctl status tomcat
● tomcat.service - Apache Tomcat 10
   Loaded: loaded (/etc/systemd/system/tomcat.service; disabled; vendor preset: disabled)
   Active: active (running) since Wed 2023-02-22 21:11:05 UTC; 3s ago
  Process: 4562 ExecStop=/usr/local/tomcat/bin/shutdown.sh (code=exited, status=0/SUCCESS)
  Process: 4648 ExecStart=/usr/local/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 4662 (java)
   CGroup: /system.slice/tomcat.service
           mq4662 /usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apa...

Feb 22 21:11:05 test.ap-northeast-1.compute.internal systemd[1]: Starting Apache Tomcat 10...
Feb 22 21:11:05 test.ap-northeast-1.compute.internal systemd[1]: Started Apache Tomcat 10.

[root@test keystore]# netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      540/rpcbind
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1266/sshd
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1099/master
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      4662/java
tcp6       0      0 :::111                  :::*                    LISTEN      540/rpcbind
tcp6       0      0 :::8080                 :::*                    LISTEN      4662/java
tcp6       0      0 :::22                   :::*                    LISTEN      1266/sshd
tcp6       0      0 ::1:25                  :::*                    LISTEN      1099/master
tcp6       0      0 :::8443                 :::*                    LISTEN      4662/java
画像.2

最後に

業務でSSL設定を行う際はApacheを使用したものがほとんどです。先述したように、TomcatはJavaを動かすソフトウェアがセットになっているため、それとは大きく設定方法が異なると感じました。

弊社では、SSL証明書取得・設置の代行を行っております。また、サーバーの構築も行っておりますので、インフラ周りでお困りの際は、お気軽にネットアシストへお問い合わせください。
SSL証明書取得・設置代行 → https://www.netassist.ne.jp/service/domain_ssl/
サーバー構築 → https://www.netassist.ne.jp/service/server/

最後まで読んでいただき、ありがとうございます。
また、お会いしましょう。

この記事をシェアする

  • facebook
  • twitter
  • hatena
  • line
URLとタイトルをコピーする

実績数30,000件!
サーバーやネットワークなど
ITインフラのことならネットアシストへ、
お気軽にご相談ください