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
キーストアファイル作成
はじめに、キーストアファイルの作成です。
キーストアファイル用のディレクトリを/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
最後に
業務でSSL設定を行う際はApacheを使用したものがほとんどです。先述したように、TomcatはJavaを動かすソフトウェアがセットになっているため、それとは大きく設定方法が異なると感じました。
弊社では、SSL証明書取得・設置の代行を行っております。また、サーバーの構築も行っておりますので、インフラ周りでお困りの際は、お気軽にネットアシストへお問い合わせください。
SSL証明書取得・設置代行 → https://www.netassist.ne.jp/service/domain_ssl/
サーバー構築 → https://www.netassist.ne.jp/service/server/
最後まで読んでいただき、ありがとうございます。
また、お会いしましょう。