Ubuntu環境でのTomcatの無料SSL証明書の設定。
関連ページ
参考URL
毎回忘れてとても面倒なのでメモ書き。
Let's Encryptという組織を利用して無料の証明書を作ります。
この証明書は90日間しか有効期間がないですが、勝手に自動更新してくれます。

ポート80接続の確認
前準備として、SSL証明書を作りたいサイトがポート80接続でつながっている事が前提になります。
Tomcatのデフォルトポートは8080なため、80から繋げるには以下のいずれかの実装が必要です。
恐らくリバースプロキシがベストですが、もっとも簡単なのは
natのPREROUTING
を使う方法です。
以下のコードを打ち込みます。
sudo iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
natの設定変更はTomcatを再起動する必要があるので以下のコードを実行します。
sudo service tomcat restart

認証書を取得
証明書を取得するためのツール
Certbot
クライアントをインストールします。(すでに持ってるなら必要ないです)
sudo apt -y install certbot
以下のコマンドを使って証明書を取得し、ポート80接続が有効になっている必要があります。
sudo
certbot
certonly
--webroot
-w
[Tomcatのディレクトリ]
/webapps/
[サイトのディレクトリ]
-d
[サイトのURL]
このコマンドを打ち込むといくつか質問が発生します。
最初はEmailを聞かれるので適当なものを打ち込みます。
その次に利用規約を聞かれますが、よく分からないのでとりあえず
(A)gree
を選択します。
その次にデジタル情報を共有するかなんとか聞かれるますが、よく分からないので
(Y)es
を選択します。
Successfully received certificate
と表示されれば成功。
メッセージ中に記載の通り
/etc/letsencrypt/live/
[サイトのURL]
のディレクトリに証明書が取得されているはずです。

証明書のフォルダに移動
/etc/letsencrypt/live/
[サイトのURL]
ディレクトリに移動する必要があります。
ただ
/etc/letsencrypt/live
フォルダは権限が厳重で、普通に移動しようとするとはじかれます。
なので
chmod
を使って権限を解放します。
作業が終わり次第、心配であれば権限を閉じても良いです。
/etc/letsencrypt/live/
[サイトのURL]
に移動すると、そこには既に5つのファイルがあるはずです。

取得した証明書からkeystgore.jksファイルを作る
まず
fullchain.pem
を
PKCS12(PFX)形式
に変換します。ここでは
tomcat.p12
として出力。
sudo openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out tomcat.p12
この際に2回パスワードが聞かれますが、適当なものを連打しておきます。
ここから
tomcat.p12
を使って
jks
を作成します。
なんでも良いですがここでは
keystore.jks
としておきます。
sudo keytool -importkeystore -destkeystore keystore.jks -srckeystore tomcat.p12 -srcstoretype PKCS12
keystore.jks
を作る際にはパスワードが3回聞かれるが適当なものを連打しておきます。
なおここで設定したパスワードは後ほどTomcatの
server.xml
で使用します。

jksをserver.xmlに設定
この作成した
keystore.jks
をtomcatの
conf
ファイルに移動させます。
sudo
mv
keystore.jks
[Tomcatのディレクトリ]
/conf/keystore.jks
conf
ディレクトリにある
server.xml
をいじります。まずはhttp接続を無効化します。
以下のようにコードを
<!--
と
-->
で囲みます。
<!--Connector port="8080" protocol="HTTP/1.1"
<wesp><wesp><wesp>connectionTimeout="20000"
<wesp><wesp><wesp>redirectPort="8443" /-->
以下のコードを打ち込んでhttpsを有効にして
keystore.jks
と紐づけます。
<Connector
port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
SSLEnabled="true"
scheme="https"
secure="true"
clientAuth="false"
sslProtocol="TLS"
keystoreFile="conf/keystore.jks"
keystorePass=
[設定したパスワード]
redirectPort="8443"/>
https接続のデフォルトのポート予約値は443なので、何かしらの方法で443から8080に繋げる必要があります。
ここではまたnatを使ってポート変換します。
sudo iptables -t nat -I PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8080
Tomcatを再起動して完了。
sudo service tomcat restart

証明書の更新
SSL証明書は、期限切れ1ヵ月前から下のコマンドでマニュアル更新ができます。
期限切れ1か月前に上のコードを実行すると、
Cert not yet due for renewal
(まだ更新する必要がない)という表示が出て、実際は更新しません。
ただ、わざわざマニュアルで打ち込まなくても、cerbotは毎日この
certbot renew
コマンドを自動で実行してくれます。
試しに下のコマンドを打ち込むと、
Timer
が設定されているのが確認できる。
sudo systemctl status certbot.timer
Trigger
に書いてあるのが次回実行予定の日時で、ここでは2024-12-18 12:46:18に更新予定が入っています。
この自動更新設定は、ubuntuだと
/etc/cron.d/certbot
に記述されてあります。
中身は下の通りで、
cron
のコードを使っています。
期限切れ1ヵ月前にrenewを実行しても実際は証明書は実行されませんが、
--force-renew
のオプションを付ける事で強制更新できます。
sudo certbot renew --force-renew
基本的には使うことはないと思います。renewal-hooksのテストで使うことはあるかもしれない。
Let's EncryptのSSL証明書更新処理はこれで終わり。
ただ証明書は自動で更新されるとしても、その都度毎回keystore.jksファイルも同時に更新する必要があります。
keystoreの自動更新方法は
こちらのページ
で紹介。
1
1