SSL証明書の作成と更新

SSL証明書の作成と更新

Ubuntu環境でのTomcatの無料SSL証明書の設定。

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

ポート80接続の確認

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

natの設定変更はTomcatを再起動する必要があるので以下のコードを実行します。
sudo service tomcat restart

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の自動更新方法は こちらのページ で紹介。
1
1