mTLS ALBはTLSハンドシェイク時のCertificate RequestにCAのDNを含めない
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)のリストを設定することができます。
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
は、以下によると下記のように解釈されます。
- 「する必要がある(SHOULD)」 English
この語句もしくは「推奨される(RECOMMENDED)」という形容表現は、 特定の状況下では、 特定の項目を無視する正当な理由が存在するかもしれませんが、 異なる選択をする前に、当該項目の示唆するところを十分に理解し、 慎重に重要性を判断しなければならない、ということを意味します。
うーむ…AWSさんには実装しておいてほしいところ…。
実機確認
実際にmTLS ALBを構築し、HTTPS通信時のパケットの内容をWireSharkで確認します。
TLSハンドシェイクの内容を確認するためには、以下のようにWireSharkでTLS通信を復号する必要があります。
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でも、類似事象が起きているようです。
Discussion