SSL証明書の作成と更新

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

取得した証明書から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ヵ月前から下のコマンドでマニュアル更新ができる。
sudo certbot renew
期限切れ1か月前に上のコードを実行すると、
 Cert not yet due for renewal 
(まだ更新する必要がない)という表示が出て、実際は更新しない。
SSL更新不要の表示

ただ、わざわざマニュアルで打ち込まなくても、cerbotは毎日このcertbot renewコマンドを自動で実行してくれる。
試しに下のコマンドを打ち込むと、Timerが設定されているのが確認できる。
sudo systemctl status certbot.timer
SSL更新のタイマー設定
 Trigger 
に書いてあるのが次回実行予定の日時で、ここでは2024-12-18 12:46:18に更新予定が入っている。

この自動更新設定は、ubuntuだと/etc/cron.d/certbotに記述されてある。
中身は下の通りで、 cron のコードを使っている。
SSL更新のcronの設定

強制手動更新

期限切れ1ヵ月前にrenewを実行しても実際は証明書は実行されないが、--force-renewのオプションを付ける事で強制更新できる。
sudo certbot renew --force-renew
SSLの強制更新
基本的には使うことはないと思う。renewal-hooksのテストで使うことはあるかもしれない。

Let's EncryptのSSL証明書更新処理はこれで終わり。
ただ証明書は自動で更新されるとしても、その都度毎回keystore.jksファイルも同時に更新する必要がある。
keystoreの自動更新方法は こちらのページ で紹介。
0
0