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
取得した証明書から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ヵ月前から下のコマンドでマニュアル更新ができる。
ただ最近のcerbotは毎日このコマンドを自動で実行してくれるみたいで、マニュアルで打つ必要はない。
試しに下のコマンドを打ち込むと、Timerが設定されているのが確認できる。
sudo systemctl status certbot.timer<br>
● certbot.timer - Run certbot twice daily
Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
Active: active (waiting) since Sun 2023-07-30 23:32:54 JST; 2 months 6 days ago
Trigger: Fri 2023-10-06 11:12:33 JST; 13h left
Triggers: ● certbot.service
Trigger: Fri 2023-10-06 11:12:33 JST; 13h left
13時間後に更新コマンドの実行予定が入ってる。
この自動更新設定は、ubuntuだと/etc/cron.d/certbotに記述されてある。
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew
ただ注意点として、証明書は自動更新されても、その後のkeystore.jksの作成は自分で再度実行する必要がある。
放っておくと500: Internal Server Errorとなってサイトが繋がらなくなるので注意。
0
0