本記事と関係ないが在日ウクライナ大使館に寄付をした。なぜかというと、非常にお世話になっているFSNotesの開発者が先月末から続いているウクライナ侵攻によって OSS 活動を無期限停止せざるを得ない状況に追い込まれており、少しでも支援をしたかったからだ。在日ウクライナ大使館のサイトにアクセスできない状態が続いているため、公式ツイートから寄付先を参照すると良い。

概要

まず断っておきたいが、ルート認証局によって子孫 SSL 証明書の安全性に問題が生じたことはWoSign の例を除いてほとんどない。わざわざ高額な手数料を支払うより、同じセキュリティ強度の証明書を無料で提供してくれる Let's Encrypt (ISRG)や ZeroSSL (Sectigo) をありがたく使わせていただく、そういう意識で問題ないのである。

国内唯一のルート認証局は SECOM が所有

  • Security Communication RootCA1 (crt.sh)
  • Security Communication RootCA2 (crt.sh)

個人が取得可能かつ自動更新に対応しているワイルドカード証明書の年間料金

金額は 2022 年 3 月現在。

  • FujiSSL (SSLStore) 19,800 円
  • FujiSSL 20,350 円
  • JPRS (Gonbei Domain) 16,500 円
  • JPRS (さくらの SSL) 18,150 円 クレカ不可(請求書払いのみ)
  • JPRS (ラット) 15,000 円
  • JPRS (JPDirect) 47,960 円

FujiSSL、JPRS のルート認証局はどちらも Security Communication RootCA2 だ。

FujiSSL は独自の自動更新ツールを提供しているが、ホストに PHP や Apache をセットアップしなければならず、HTTP サーバーを内蔵している lego や certbot と比べてやや煩雑な印象は拭えない。独自方式なので、当然 ACME 対応クライアントは使えない。

ACME

RFC 8555 - Automatic Certificate Management Environment (ACME) は自動化されたドメイン認証 SSL 証明書発行手続きを標準化しようとする一連の努力の成果である。

JPRS が ACME に対応

タイミングの良いことに、JPRS が 2022/3/2 から ACME に対応した。

JPRS サーバー証明書認証局証明書ポリシーに目を通してどの認証方式に対応しているのか調べてみよう。

3.2.2.4.7 DNS Change

DNS ゾーンに_acme-challenge TXT レコードを置いてドメインの所有権を確認する方式。一番簡単で制約が少ない。

3.2.2.4.18 Agreed-Upon Change to Website v2

HTTP/HTTPS サーバーを立ち上げて.well-known/pki-validation以下に置いたチャレンジトークンを PKI 側が確認する方式。しかし、

2021 年 11 月 18 日以降に発行する証明書について、先頭ラベルが"*"(ワイルドカード)の FQDN に対してこの方法を適用外とする。

ワイルドカード証明書の場合この方式が使えない。

3.2.2.4.19 Agreed-Upon Change to Website - ACME

先頭ラベルが"*"(ワイルドカード)の FQDN に対してこの方法を適用外とする

同上

4.2.4 CAA レコードの確認

本 CA は、RFC 6844 に従い、申請情報の審査時に CAA レコードを確認する。CAA レコードに記載する本 CA のドメインは「jprs.jp」とする。

DNS ゾーンに CAA レコードを置いて内容をjprs.jpにする必要がある。

ACME クライアント

Go 製の ACME クライアントlegoは DNS-01 認証に対応しているため、JPRS ACME 証明書の発行がスムーズにできる可能性がある。

CLOUDFLARE_DNS_API_TOKEN=<token> \
lego \
  --server 'https://acme.amecert.jprs.jp/DV/getDirectory' \
  --eab --kid 'NUtfiBgcWr9oGCWmF8PQd2d499T7WrgqsnkxIOAPASE' --hmac 'Shn8-aYwhUw0esMLnqJL_o9Fg_BszfAgrRJjOtGQGGY' \
  --accept-tos \
  --path ./certs \
  --dns cloudflare \
  --email '[email protected]' \
  --domains '*.example.jp' \
  run

nginx-proxy/acme-companionは、ACME_CA_URI環境変数を指定することで JPRS に対応できるが、HTTP-01 認証に依存しているため ワイルドカード証明書は発行できないだろう。今後対応する可能性はある。

docker run -d \
  --name your-proxied-app \
  -e "VIRTUAL_HOST=subdomain.example.jp" \
  -e "LETSENCRYPT_HOST=subdomain.example.jp" \
  -e "ACME_CA_URI=https://acme.amecert.jprs.jp/DV/getDirectory" \
  nginx

JPRS に問い合わせたところ、ACME の利用には JPRS と指定事業者両方の対応が必要になるそうだ。現在どの指定事業者も対応していないため、残念ながらもう少し待たなくてはならない。今後 ACME 経由で証明書の発行を試す機会があれば記事を更新する。