KAKEHASHI Tech Blog

カケハシのEngineer Teamによるブログです。

サイズが小さい新形式Let's Encrypt証明書

Let's Encryptのプロファイル選択機能

Let's EncryptにはProfile機能があり、異なる仕様のサーバ証明書を発行できます。

説明ページにある通り、現在classictlsserverの2種類のプロファイルが選択できます。(shortlivedプロファイルもありますが、まだ一般公開されておらず利用できません)

プロファイルを選択すると何が変わるのか

何も選択しなければclassicプロファイルが選択されます。通常Let's Encryptの証明書といえばこの証明書です。tlsserverを選択すると、新しい仕様の証明書が発行されます。

「新しい仕様」とはCA/Browserフォーラムのベースライン要求の推奨設定や、WebPKIコミュニティにおけるトレンドを反映したものです。現代のTLSサーバでは使われていなかったり、冗長なフィールドが取り除かれています。その分証明書のサイズが小さくなり、TLSハンドシェイクの高速化が期待できます。

一方で古いクライアントや古いサーバ(特にアプライアンス)は、新しいプロファイルで発行した証明書が利用できない可能性があるので、注意が必要です。

現時点でまだ利用できないshortlivedプロファイルは、その名の通り有効期限が短い証明書を発行するプロファイルで、有効期間は6日+16時間(通常のLet's Encrypt証明書は90日)です。2025年中の一般公開が予定されています。2025年7月8日時点で発行できるのはStaging環境のみです。詳細は公式ブログのAnnouncing Six Day and IP Address Certificate Options in 2025を参照してください。

プロファイルごとの証明書仕様比較

仕様の違いを表にすると以下の通りです。

classic tlsserver shortlived
ステータス 標準 選択可能 未公開
有効期間 90日 90日 160時間(6日+16時間)
ドメイン認証の制限時間 7日間 1時間 1時間
ドメイン認証結果の有効期間 30日間 7時間 7時間
証明書発行完了までの制限時間 7日間 8時間 8時間
Common Name あり なし なし
Key Encipherment Key Usage あり なし なし
Extended Key UsageのTLS Client Auth あり なし なし
Subject Key ID あり なし なし
失効情報 CRL CRL CRL
SANの上限 100 25 25
利用可能な名前 FQDN FQDN FQDN,IPアドレス

tlsservershortlivedclassicと比べて、証明書を発行するまでのタイムリミットが軒並み厳しくなっています。DNSレコードの追加を手動でやっていた場合、新プロファイルでは設定が難しくなる可能性があります。

削除されているのはサーバ証明書ではあまり聞きなれないフィールドが中心ですが、Common Nameの削除は意外に思われるかもしれません。実はCommon Nameはもう使われておらず、RFC 9525 "Service Identity in TLS"でサービスの識別に使ってはいけない(MUST NOT)とされています。 これは機能が多く、値の解釈の揺らぎがないSubject Alternative Names extension(SAN)が実装されたことにより、役割が重複してしまったためです。

Extended Key UsageのTLS Client Authenticationは本来サーバ証明書には不要な値なので、2026年2月11日以降classicプロファイルでも含まれなくなります。

実際に発行する

プロファイル選択に対応したACMEクライアントが必要ですが、Certbot, Lego, dehydratedは対応していることを確認しています。

今回はLegoを利用します。Legoは1バイナリで証明書の作成更新から認証用DNSレコードの取り扱いまでやってくれるので、導入しやすいツールです。LegoはデフォルトでECDSA P-256形式の証明書を発行します。RSA形式の証明書は明示的な指定が必要なので注意してください。

Legoでtlsserverプロファイルを使うには、このように--profile tlsserverを付与します。ここではDNSのゾーン管理はRoute53で行っているものとしています。

lego --accept-tos -d www.example.com -m mail@example.com --dns route53 -k rsa2048 run --profile tlsserver

今回は実際に使うことを意図していないので、Let's EncryptのStaging環境で発行します。LegoでStaging環境を使うためには--server=https://acme-staging-v02.api.letsencrypt.org/directoryを付与します。

lego --accept-tos --server=https://acme-staging-v02.api.letsencrypt.org/directory -d www.example.com -m mail@example.com --dns route53 -k rsa2048 run --profile tlsserver

発行した証明書の中身を確認します。

まずはclassicプロファイル(デフォルト)から。

$ openssl x509 -text -noout -in classic.example.com.crt
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            2c:eb:(snip)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, O=(STAGING) Let's Encrypt, CN=(STAGING) Wannabe Watercress R11
        Validity
            Not Before: Jun 23 04:26:52 2025 GMT
            Not After : Sep 21 04:26:51 2025 GMT
        Subject: CN=classic.example.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:99:ad:25:86:85:68:a6:f3:21:66:b3:a5:32:ed:
                    (snip)
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage: 
                TLS Web Server Authentication, TLS Web Client Authentication
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Subject Key Identifier: 
                AA:66:(snip)
            X509v3 Authority Key Identifier: 
                13:CB:(snip)
            Authority Information Access: 
                CA Issuers - URI:http://stg-r11.i.lencr.org/
            X509v3 Subject Alternative Name: 
                DNS:classic.example.com
            X509v3 Certificate Policies: 
                Policy: 2.23.140.1.2.1
            X509v3 CRL Distribution Points: 
                Full Name:
                  URI:http://stg-r11.c.lencr.org/53.crl

            CT Precertificate SCTs: 
                Signed Certificate Timestamp:
                    Version   : v1 (0x0)
                    Log ID    : 28:76:(snip)
                    Timestamp : Jun 23 05:25:22.254 2025 GMT
                    Extensions: none
                    Signature : ecdsa-with-SHA256
                                30:46:(snip)
                Signed Certificate Timestamp:
                    Version   : v1 (0x0)
                    Log ID    : C0:5D:(snip)
                    Timestamp : Jun 23 05:25:22.786 2025 GMT
                    Extensions: 00:00:05:00:3A:88:22:EC
                    Signature : ecdsa-with-SHA256
                                30:45:(snip)
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        16:08:8f:08:93:6d:c9:6a:8e:4b:46:d9:46:e6:29:25:b4:db:
        (snip)

次にtlsserverプロファイルの証明書。

$ openssl x509 -text -noout -in tlsserver.example.com.crt
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            2c:f1:18:27:36:6e:e5:48:88:f4:ef:bc:1b:ab:ec:00:68:9c
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, O=(STAGING) Let's Encrypt, CN=(STAGING) Wannabe Watercress R11
        Validity
            Not Before: Jun 23 04:30:43 2025 GMT
            Not After : Sep 21 04:30:42 2025 GMT
        Subject: 
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:bb:9e:24:7d:92:74:5a:0b:37:a2:d2:26:4f:69:
                    (snip)
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature
            X509v3 Extended Key Usage: 
                TLS Web Server Authentication
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Authority Key Identifier: 
                13:CB:(snip)
            Authority Information Access: 
                CA Issuers - URI:http://stg-r11.i.lencr.org/
            X509v3 Subject Alternative Name: critical
                DNS:tlsserver.example.com
            X509v3 Certificate Policies: 
                Policy: 2.23.140.1.2.1
            X509v3 CRL Distribution Points: 
                Full Name:
                  URI:http://stg-r11.c.lencr.org/29.crl

            CT Precertificate SCTs: 
                Signed Certificate Timestamp:
                    Version   : v1 (0x0)
                    Log ID    : 28:(snip)
                    Timestamp : Jun 23 05:29:13.654 2025 GMT
                    Extensions: none
                    Signature : ecdsa-with-SHA256
                                30:44:(snip)
                Signed Certificate Timestamp:
                    Version   : v1 (0x0)
                    Log ID    : B0:CC:(snip)
                    Timestamp : Jun 23 05:29:13.621 2025 GMT
                    Extensions: none
                    Signature : ecdsa-with-SHA256
                                30:45:(snip)
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        5c:b3:f6:da:e7:74:d3:9b:07:d2:e6:a1:22:13:a2:9f:3a:e5:
        (snip)

このようにtlsserverプロファイルだとCommon Nameなどが削られているため、証明書の中身も少し短くなります。

実際に証明書のファイル長がどれくらい短くなっているのか調べるため、上記とは異なる27bytesのFQDNで証明書を発行し、ファイルサイズを比較しました。全てLet's EncryptのStaging環境で発行しています。 比較のためRSA 2048とECDSA P-256それぞれの形式で発行します。

アルゴリズム classic tlsserver 差分
RSA 2048 3791 3677 -114
ECDSA P-256 3027 2933 -94

アルゴリズムによって異なりますが、100bytes程度小さくなっています。割合にして3%程度の削減効果です。大規模システムでなければ性能にはほとんど影響がないレベルですが、将来的に移行が必要になることを想定して先んじて切り替えていくのも良いでしょう。

担当:松浦