-100p

-10p

+10p

+100p

SSL証明書

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

PREROUTINGを全て解除するコードも記載しておく。例えばリバースプロキシなどもっと洗練された方法でポート問題を解決する場合、このPREROUTINGは逆に邪魔になってしまう。
sudo iptables -t nat -F

認証書を取得

証明書を取得するためのツール 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を使って権限を解放する。
sudo chmod 777 live
作業が終わり次第、心配であれば権限を閉じても良い。
sudo chmod 700 live
/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ヵ月前から下のコマンドでマニュアル更新ができる。
sudo certbot renew

ただ最近の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

-100p

-10p

+10p

+100p