2024年4月25日、Ubuntu 24.04 LTSがリリースされました。
筆者はUbuntu 24.04 LTS + Cockpitを自宅の次期仮想マシンプラットフォームにする予定で、先日ベータ版を利用して紹介記事を書いたのですが、この記事では自己署名証明書をそのまま利用していました。そこでこの記事の補完ネタとして、Let's Encryptで正規のSSL証明書を取得し、Cockpitから利用する方法をここで紹介します。
CockpitはLAN内で運用する上、SSL証明書の取得のためだけにポートを開きたくはないため、DNS-01チャレンジを使用します。またDNSサーバーとしてはAWSのRoute 53を使う想定です。
IAMユーザーの作成とアクセスキーの発行
まずAWS上で、Certbotが利用するIAMユーザーを作成し、アクセスキーを発行しておきます。必要な権限は以下の通りです。ユーザーのインラインポリシーとして作成するのが手っとり早いでしょう。なお ChangeResourceRecordSets
は、該当のゾーンに対してのみ許可されていればいいため、リソースを限定する方が望ましいのですが、筆者は複数のゾーンをホストしていることもあり、特に制限は入れていません。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "route53:GetChange", "route53:ListHostedZones", "route53:ChangeResourceRecordSets" ], "Resource": "*" } ] }
UbuntuにAWSCLIをインストールし(snapを使うと便利です)、rootユーザーにアクセスキーを設定しておいてください。
$ sudo snap install aws-cli --classic $ sudo aws configure
Certbotのインストールと証明書の取得
certbotパッケージと、Route 53用のプラグインをインストールします。
$ sudo apt install -y certbot python3-certbot-dns-route53
AWSの設定が正しければ、以下のコマンドで証明書を発行できます。
$ sudo certbot certonly --dns-route53 \ -n \ -d '証明書のコモンネーム' \ --email メールアドレス \ --agree-tos
SSL証明書の設定
Cockpitは /etc/cockpit/ws-certs.d/
以下から証明書を読み込みます。ここに CockpitのFQDN.crt(証明書)
CockpitのFQDN.key(秘密鍵)
という名前でファイルを配置してください。とはいえCerrtbotで取得した証明書は90日ごとに更新されますし、いちいちコピーするのも筋が悪いですから、シンボリックリンクを張るといいでしょう。証明書は /etc/letsencrypt/live/証明書のコモンネーム
ディレクトリ内にありますので、以下のようにします。
$ cd /etc/cockpit/ws-certs.d/ $ sudo ln -s /etc/letsencrypt/live/証明書のコモンネーム/fullchain.pem 証明書のコモンネーム.crt $ sudo ln -s /etc/letsencrypt/live/証明書のコモンネーム/privkey.pem 証明書のコモンネーム.key
あとはCockpitを再起動すれば、正規のSSL証明書が読み込まれます。
Cockpitの待ち受けポートを変更する
CockpitはデフォルトでTCPの9090番ポートで接続を待ち受けます。前段にリバースプロキシを置くのであれば、このままでもよいのですが、他のアプリを動かさないのであれば、Cockpitに直接443番ポートを待ち受けさせてしまってもいいでしょう。ポートを待ち受けているのはsystemd.socketですので、以下のコマンドでオーバーライドを作成します。
$ sudo systemctl edit cockpit.socket
テキストエディタが起動したら、以下の内容を記述してください。最初に空の ListenStream=
を書くことで、デフォルトの9090番ポートの待ち受けをキャンセルする所がポイントです。
[Socket] ListenStream= ListenStream=443
変更を保存したら、 cockpit.socket
を再起動してください。