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

ポート80接続の確認
前準備として、SSL証明書を作りたいサイトがポート80接続でつながっている事が前提になる。
Tomcatのデフォルトポートは8080なため、80から繋げるにはserver.xmlのポート設定をいじったり、Apacheのリバースプロキシを使うなど色々方法があるが、一番簡単なのは恐らくnatでポート変換すること。
sudo iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
natの設定変更はTomcatを再起動する必要があるので実行。
sudo service tomcat stop
sudo service tomcat start

認証書を取得
証明書を取得するためのツール 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つのファイルがある。
cert.pem => SSLサーバー証明書 (公開鍵含む)
chain.pem => 中間証明書
fullchain.pem => cert.pem と chain.pem が結合されたファイル
privkey.pem => 公開鍵に対する秘密鍵
README => README

取得した証明書から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の自動更新方法は
こちらのページ
で紹介。
0
0