🎫

OPNsense の ACME Client (Let's Encrypt) を AWS Route53 と組み合わせて動かしてみた

2022/11/17に公開

Let's Encrypt で SSL 証明書を設定したくなった

最近、色んなブラウザーや仕組みで SSL 証明書によって通信を保護するのが必須化されてきてますね。。。
一般家庭で毎年 SSL 証明書を買うのも大変&家の中で CA (認証局) を立てても、Android や iPhone や PC 等に Root CA 証明書をばらまくのももっと大変、なので Let's Encrypt 様に頼ろうと思います。

Route53 の Public ホストゾーンを作成する

Let's Encrypt の証明書発行時には DNS 上に一時的にレコードが追加されるのをインターネット越しにチェックしていますので、外からアクセスできるパブリックホストゾーンにしておきます。

必要に応じて上位ドメインやレジストラにネームサーバー(NSレコード)を登録しておきます。

ACME Client が Route53 を操作するための IAM User とアクセストークンを払い出す

AWS Management Console 上で IAM User を作成します。
そのとき、ウィザード上では特にグループや AWS が用意しているアクセス権限を付けずに、以下のインラインポリシーだけ後付けすればオッケーです。

inline-policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "route53:GetChange",
                "route53:ChangeResourceRecordSets",
                "route53:ListResourceRecordSets"
            ],
            "Resource": [
                "arn:aws:route53:::hostedzone/*",
                "arn:aws:route53:::change/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "route53:ListHostedZonesByName",
                "route53:ListHostedZones"
            ],
            "Resource": "*"
        }
    ]
}

見かけたドキュメントだと Action は route53:ListHostedZonesByName だけで良いとなっているものがありましたが、 route53:ListHostedZones が必須です。
(最初のうちは上手く行かなくて CloudTrail で API ログをひたすら追いかけて原因を探しました)

OPNsense の設定を行う

インストール

OPNsense の管理画面を開いて System > Firmware > Plugins をたどって os-acme-client を選択します。

プラグインの右端の「+」ボダンを押してインストールします。

Settings

インストール直後は、Enable Plugin が無効になっているのチェックしておきます。
それ以外はデフォルトのままでOK。

Accounts

Let's Encrypt のアカウント名を入れておきます。
Tips にも書きましたが、テスト中は Let's Encrypt Test CA にしておくと複数回設定ミスした時にロックアウトされにくいのでおすすめです。

Challenge Types

AWS Route53 に設定したゾーン名(ドメイン名)を入力し、Challenge Typeを DNS-1 にします。
DNS Service で AWS Route 53 を選択すると、下の方に AWS ID と AWS Secret の欄が表示されるので IAM User を作成したときに出てきたシークレットキーとアクセスキーを入力します。

DNS Sleep Time の初期値は 0 秒ですが、Route 53 の中での DNS レコードの更新反映待ちの時時間がかかることから 60 秒程度に伸ばしておきます。

Certificates

Common Name には証明書の対象となるドメイン名を記入します。複数のドメイン名が必要な場合は、Alt Names に列挙することも出来ます。
ACME CA Settings の ACME Account や Challenge Type は先ほど設定したものを選択します。

Automations の設定内容は後述します。

Automations

SSL 証明書の更新後に実行したい処理を。画面例だと、OPNsense 管理画面と Nginx サービスでそれぞれ SSL 証明書を使っているのでサービスを再起動しています。

おまけ

OPNsense の管理画面も HTTPS 化する

無事に ACME Client で SSL 証明書をセットアップ出来ると、OPNsense の管理画面の System > Settings > Administration の SSL Certificate に選択肢が追加されています。
これを選んで Protocol を HTTPS にして Save すると管理画面が再起動されて HTTPS 化されます。

Discussion