🪢

mTLS ALBはTLSハンドシェイク時のCertificate RequestにCAのDNを含めない

2024/07/27に公開

mTLSハンドシェイクプロセス

一般にmTLSのハンドシェイクのプロセスは以下のようになります。

1. ハンドシェイク開始 (クライアント→サーバ)

1.1 ClientHello

  • クライアントがサポートしているTLSバージョン(例:TLS 1.2, TLS 1.3)を送信
  • 対応可能な暗号スイートのリストを送信
  • クライアント側のランダムな数値(Client Random)を生成し送信
  • セッションIDまたはセッションチケット(再接続用)を送信
  • サポートする拡張機能(SNI, ALPN等)を送信

2. サーバレスポンス (サーバ→クライアント)

2.1 Server Hello

  • 使用するTLSバージョンを選択し通知
  • 使用する暗号スイートを選択し通知
  • サーバー側のランダムな数値(Server Random)を生成し送信
  • 新しいセッションIDを生成し送信(必要な場合)
  • クライアントが提案した拡張機能のうち、使用するものを通知

2.2 Server Certificate

  • サーバーの X.509 証明書チェーンを送信
    • サーバーの公開鍵を含む
    • 通常、中間CA証明書も含まれる

2.3 Server Key Exchange (オプション)

  • 一時的な鍵交換が必要な場合(DHE, ECDHE等)に送信
  • サーバーの一時的な公開鍵パラメータを含む
  • パラメータにサーバーの秘密鍵で署名を付与(中間者攻撃対策)

2.4 Certificate Request (mTLS特有)

  • サーバーがクライアントに証明書を要求
  • 受け入れ可能な証明書タイプのリストを含む
  • 信頼する認証局(CA)のリストを含む
  • 期待する識別名(DN)の情報を含む場合もある★

2.5 Server Hello Done

  • サーバーのハンドシェイクメッセージ送信完了を通知

3. クライアント認証とキー交換 (クライアント→サーバ)

3.1 Client Certificate (mTLS特有)

  • クライアントのX.509証明書チェーンを送信
  • 証明書が要求された場合のみ送信(通常のTLSでは省略)

3.2 Client Key Exchange

  • プリマスターシークレットを生成
    • RSAの場合:サーバーの公開鍵で暗号化して送信
    • (EC)DHEの場合:クライアントの公開鍵パラメータを送信

3.3 Certificate Verify (mTLS特有)

  • これまでのハンドシェイクメッセージのハッシュに、クライアントの秘密鍵で署名
  • サーバーがこの署名を検証し、クライアントの身元と証明書の所有を確認

3.4 Change Cipher Spec

  • 以降のメッセージは新しい鍵と暗号スイートで暗号化することを通知

3.5 Finished

  • マスターシークレットとこれまでのハンドシェイクメッセージから計算したVerify_dataを送信
  • 新しいセッション鍵で暗号化

4. サーバ最終応答 (サーバ→クライアント)

4.1 Change Cipher Spec

  • 以降のメッセージは新しい鍵と暗号スイートで暗号化することを通知

4.2 Finished

  • マスターシークレットとこれまでのハンドシェイクメッセージから計算したVerify_dataを送信
  • 新しいセッション鍵で暗号化

5. アプリケーションデータ通信 (双方向)

  • TLSセッションが確立し、安全なアプリケーションデータの双方向通信が可能
  • セッション鍵を使用して、データの暗号化と完全性保護を実施

確認したいこと

2.4 Certificate Requestでは、サーバからクライアントへ、クライアント証明書の要求を行います。このとき、「certificate_authorities」拡張で、期待する証明書の認証局の識別名(DN)のリストを設定することができます。

https://datatracker.ietf.org/doc/html/rfc8446#section-4.2.4

The "certificate_authorities" extension is used to indicate the
certificate authorities (CAs) which an endpoint supports and which
SHOULD be used by the receiving endpoint to guide certificate
selection.
...
authorities: A list of the distinguished names [X501] of acceptable
certificate authorities, represented in DER-encoded [X690] format.
These distinguished names specify a desired distinguished name for
a trust anchor or subordinate CA; thus, this message can be used
to describe known trust anchors as well as a desired authorization
space.

しかしながら、実施のALBの挙動では、この「certificate_authorities」拡張がレスポンスに含まれていないようです。
RFCにおけるSHOULDは、以下によると下記のように解釈されます。

https://www.nic.ad.jp/ja/tech/ipa/RFC2119JA.html

  1. 「する必要がある(SHOULD)」 English
    この語句もしくは「推奨される(RECOMMENDED)」という形容表現は、 特定の状況下では、 特定の項目を無視する正当な理由が存在するかもしれませんが、 異なる選択をする前に、当該項目の示唆するところを十分に理解し、 慎重に重要性を判断しなければならない、ということを意味します。

うーむ…AWSさんには実装しておいてほしいところ…。

実機確認

実際にmTLS ALBを構築し、HTTPS通信時のパケットの内容をWireSharkで確認します。
TLSハンドシェイクの内容を確認するためには、以下のようにWireSharkでTLS通信を復号する必要があります。

https://milestone-of-se.nesuke.com/nw-basic/tls/decrypt-tls-at-executing-packetcapture/

mTLS ALBの構築手順は省略します。ALBはトラストストアと連携し、mTLS検証モードで動作するようにします。

WireSharkでキャプチャした、冒頭で説明したTLSハンドシェイクの「Server Hello」におけるパケットの内容を以下に抜粋します。

Transport Layer Security
    TLSv1.3 Record Layer: Handshake Protocol: Server Hello
        Content Type: Handshake (22)
        Version: TLS 1.2 (0x0303)
        Length: 122
        Handshake Protocol: Server Hello
            Handshake Type: Server Hello (2)
            Length: 118
            Version: TLS 1.2 (0x0303)
            Random: MASKED
            Session ID Length: 32
            Session ID: MASKED
            Cipher Suite: TLS_AES_128_GCM_SHA256 (0x1301)
            Compression Method: null (0)
            Extensions Length: 46
            Extension: supported_versions (len=2) TLS 1.3
                Type: supported_versions (43)
                Length: 2
                Supported Version: TLS 1.3 (0x0304)
            Extension: key_share (len=36) x25519
                Type: key_share (51)
                Length: 36
                Key Share extension
                    Key Share Entry: Group: x25519, Key Exchange length: 32
                        Group: x25519 (29)
                        Key Exchange Length: 32
                        Key Exchange: MASKED
            [JA3S Fullstring: MASKED,MASKED,MASKED]
            [JA3S: MASKED]
    TLSv1.3 Record Layer: Change Cipher Spec Protocol: Change Cipher Spec
        Content Type: Change Cipher Spec (20)
        Version: TLS 1.2 (0x0303)
        Length: 1
        Change Cipher Spec Message
    TLSv1.3 Record Layer: Handshake Protocol: Encrypted Extensions
        Opaque Type: Application Data (23)
        Version: TLS 1.2 (0x0303)
        Length: 36
        [Content Type: Handshake (22)]
        Handshake Protocol: Encrypted Extensions
            Handshake Type: Encrypted Extensions (8)
            Length: 15
            Extensions Length: 13
            Extension: server_name (len=0)
                Type: server_name (0)
                Length: 0
            Extension: application_layer_protocol_negotiation (len=5)
                Type: application_layer_protocol_negotiation (16)
                Length: 5
                ALPN Extension Length: 3
                ALPN Protocol
                    ALPN string length: 2
                    ALPN Next Protocol: h2
    TLSv1.3 Record Layer: Handshake Protocol: Certificate Request
        Opaque Type: Application Data (23)
        Version: TLS 1.2 (0x0303)
        Length: 68
        [Content Type: Handshake (22)]
        Handshake Protocol: Certificate Request
            Handshake Type: Certificate Request (13)
            Length: 47
            Certificate Request Context Length: 0
            Extensions Length: 44
            Extension: signature_algorithms (len=40)
                Type: signature_algorithms (13)
                Length: 40
                Signature Hash Algorithms Length: 38
                Signature Hash Algorithms (19 algorithms)
                    Signature Algorithm: rsa_pss_pss_sha256 (0x0809)
                    Signature Algorithm: rsa_pss_pss_sha384 (0x080a)
                    Signature Algorithm: rsa_pss_pss_sha512 (0x080b)
                    Signature Algorithm: rsa_pss_rsae_sha256 (0x0804)
                    Signature Algorithm: rsa_pss_rsae_sha384 (0x0805)
                    Signature Algorithm: rsa_pss_rsae_sha512 (0x0806)
                    Signature Algorithm: rsa_pkcs1_sha256 (0x0401)
                    Signature Algorithm: rsa_pkcs1_sha384 (0x0501)
                    Signature Algorithm: rsa_pkcs1_sha512 (0x0601)
                    Signature Algorithm: SHA224 RSA (0x0301)
                    Signature Algorithm: ecdsa_secp256r1_sha256 (0x0403)
                    Signature Algorithm: ecdsa_secp256r1_sha256 (0x0403)
                    Signature Algorithm: ecdsa_secp384r1_sha384 (0x0503)
                    Signature Algorithm: ecdsa_secp384r1_sha384 (0x0503)
                    Signature Algorithm: ecdsa_secp521r1_sha512 (0x0603)
                    Signature Algorithm: ecdsa_secp521r1_sha512 (0x0603)
                    Signature Algorithm: SHA224 ECDSA (0x0303)
                    Signature Algorithm: rsa_pkcs1_sha1 (0x0201)
                    Signature Algorithm: ecdsa_sha1 (0x0203)
    TLS segment data (993 bytes)

上記のTLSv1.3 Record Layer: Handshake Protocol: Certificate Requestの配下には、「certificate_authorities」拡張が存在するはずなんですが、記述がありません。
実際に、mTLS ALBのTLSハンドシェイクでは、「certificate_authorities」拡張が存在しないことが確認できました。
このときのALBのセキュリティポリシーはELBSecurityPolicy-TLS13-1-2-2021-06を利用しています。

念の為、セキュリティポリシーのELBSecurityPolicy-TLS-1-2-Ext-2018-06でもTLSハンドシェイクのCertificate Requestを確認しました。

Transport Layer Security
    TLSv1.2 Record Layer: Handshake Protocol: Server Key Exchange
        Content Type: Handshake (22)
        Version: TLS 1.2 (0x0303)
        Length: 333
        Handshake Protocol: Server Key Exchange
Transport Layer Security
    TLSv1.2 Record Layer: Handshake Protocol: Certificate Request
        Content Type: Handshake (22)
        Version: TLS 1.2 (0x0303)
        Length: 31
        Handshake Protocol: Certificate Request
            Handshake Type: Certificate Request (13)
            Length: 27
            Certificate types count: 2
            Certificate types (2 types)
                Certificate type: RSA Sign (1)
                Certificate type: ECDSA Sign (64)
            Signature Hash Algorithms Length: 20
            Signature Hash Algorithms (10 algorithms)
                Signature Algorithm: rsa_pkcs1_sha256 (0x0401)
                Signature Algorithm: rsa_pkcs1_sha384 (0x0501)
                Signature Algorithm: rsa_pkcs1_sha512 (0x0601)
                Signature Algorithm: SHA224 RSA (0x0301)
                Signature Algorithm: ecdsa_secp256r1_sha256 (0x0403)
                Signature Algorithm: ecdsa_secp384r1_sha384 (0x0503)
                Signature Algorithm: ecdsa_secp521r1_sha512 (0x0603)
                Signature Algorithm: SHA224 ECDSA (0x0303)
                Signature Algorithm: rsa_pkcs1_sha1 (0x0201)
                Signature Algorithm: ecdsa_sha1 (0x0203)
            Distinguished Names Length: 0 # ★★★この部分★★★
    TLSv1.2 Record Layer: Handshake Protocol: Server Hello Done

やはり、DNが0byteとなっており、含まれておりません。

参考までに、「certificate_authorities」拡張がある場合のパケットは以下のようになります。

Transport Layer Security
    TLSv1.3 Record Layer: Handshake Protocol: Server Hello
        Content Type: Handshake (22)
        Version: TLS 1.2 (0x0303)
        Length: 122
        Handshake Protocol: Server Hello
            Handshake Type: Server Hello (2)
            Length: 118
            Version: TLS 1.2 (0x0303)
            Random: MASKED
            Session ID Length: 32
            Session ID: MASKED
            Cipher Suite: TLS_AES_256_GCM_SHA384 (0x1302)
            Compression Method: null (0)
            Extensions Length: 46
            Extension: supported_versions (len=2) TLS 1.3
                Type: supported_versions (43)
                Length: 2
                Supported Version: TLS 1.3 (0x0304)
            Extension: key_share (len=36) x25519
                Type: key_share (51)
                Length: 36
                Key Share extension
                    Key Share Entry: Group: x25519, Key Exchange length: 32
                        Group: x25519 (29)
                        Key Exchange Length: 32
                        Key Exchange: MASKED
            [JA3S Fullstring: MASKED,MASKED,MASKED]
            [JA3S: MASKED]
    TLSv1.3 Record Layer: Change Cipher Spec Protocol: Change Cipher Spec
        Content Type: Change Cipher Spec (20)
        Version: TLS 1.2 (0x0303)
        Length: 1
        Change Cipher Spec Message
    TLSv1.3 Record Layer: Handshake Protocol: Encrypted Extensions
        Opaque Type: Application Data (23)
        Version: TLS 1.2 (0x0303)
        Length: 42
        [Content Type: Handshake (22)]
        Handshake Protocol: Encrypted Extensions
            Handshake Type: Encrypted Extensions (8)
            Length: 21
            Extensions Length: 19
            Extension: server_name (len=0)
                Type: server_name (0)
                Length: 0
            Extension: application_layer_protocol_negotiation (len=11)
                Type: application_layer_protocol_negotiation (16)
                Length: 11
                ALPN Extension Length: 9
                ALPN Protocol
                    ALPN string length: 8
                    ALPN Next Protocol: http/1.1
    TLSv1.3 Record Layer: Handshake Protocol: Certificate Request
        Opaque Type: Application Data (23)
        Version: TLS 1.2 (0x0303)
        Length: 249
        [Content Type: Handshake (22)]
        Handshake Protocol: Certificate Request
            Handshake Type: Certificate Request (13)
            Length: 228
            Certificate Request Context Length: 0
            Extensions Length: 225
            Extension: signature_algorithms (len=38)
                Type: signature_algorithms (13)
                Length: 38
                Signature Hash Algorithms Length: 36
                Signature Hash Algorithms (18 algorithms)
                    Signature Algorithm: ecdsa_secp256r1_sha256 (0x0403)
                    ...省略...
                    Signature Algorithm: rsa_pkcs1_sha1 (0x0201)
            Extension: certificate_authorities (len=179) # ★★★この部分★★★
                Type: certificate_authorities (47)
                Length: 179
                Distinguished Names Length: 177
                Distinguished Names (177 bytes)
                    Distinguished Name Length: 175
                     [truncated]Distinguished Name: (pkcs-9-at-emailAddress=MASKED,id-at-name=MASKED,id-at-commonName=MASKED,id-at-organizationalUnitName=MASKED,id-at-organizationName=MASKED,id-at-localityName=MASKED,id-at-s
                        RDNSequence item: 1 item (id-at-countryName=JP)
                            RelativeDistinguishedName item (id-at-countryName=JP)
                                Object Id: 2.5.4.6 (id-at-countryName)
                                CountryName: JP
                        RDNSequence item: 1 item (id-at-stateOrProvinceName=MASKED)
                            RelativeDistinguishedName item (id-at-stateOrProvinceName=MASKED)
                                Object Id: 2.5.4.8 (id-at-stateOrProvinceName)
                                DirectoryString: printableString (1)
                                    printableString: MASKED
                        RDNSequence item: 1 item (id-at-localityName=MASKED)
                            RelativeDistinguishedName item (id-at-localityName=MASKED)
                                Object Id: 2.5.4.7 (id-at-localityName)
                                DirectoryString: printableString (1)
                                    printableString: MASKED
                        RDNSequence item: 1 item (id-at-organizationName=MASKED)
                            RelativeDistinguishedName item (id-at-organizationName=MASKED)
                                Object Id: 2.5.4.10 (id-at-organizationName)
                                DirectoryString: printableString (1)
                                    printableString: MASKED
                        RDNSequence item: 1 item (id-at-organizationalUnitName=MASKED)
                            RelativeDistinguishedName item (id-at-organizationalUnitName=MASKED)
                                Object Id: 2.5.4.11 (id-at-organizationalUnitName)
                                DirectoryString: printableString (1)
                                    printableString: MASKED
                        RDNSequence item: 1 item (id-at-commonName=MASKED)
                            RelativeDistinguishedName item (id-at-commonName=MASKED)
                                Object Id: 2.5.4.3 (id-at-commonName)
                                DirectoryString: printableString (1)
                                    printableString: MASKED
                        RDNSequence item: 1 item (id-at-name=MASKED)
                            RelativeDistinguishedName item (id-at-name=MASKED)
                                Object Id: 2.5.4.41 (id-at-name)
                                DirectoryString: printableString (1)
                                    printableString: MASKED
                        RDNSequence item: 1 item (pkcs-9-at-emailAddress=MASKED)
                            RelativeDistinguishedName item (pkcs-9-at-emailAddress=MASKED)
                                Object Id: 1.2.840.113549.1.9.1 (pkcs-9-at-emailAddress)
                                IA5String: MASKED
    TLS segment data (806 bytes)

上記のように、「certificate_authorities」拡張で、認証局のDNが記述されています。

類似事象

Google Cloudでも、類似事象が起きているようです。
https://stackoverflow.com/questions/76757643/mtls-google-cloud-not-providing-certificate-authorities-in-tls-handshake

Discussion