Azure Front Door の TLS 1.3 サポート状況がドキュメント上よくわからなかったので検証してみた

2024.02.20

いわさです。

先日 AWS の特定サービスにおける TLS 1.3 サポートについて記事を書きました。

その際に気になったのですが Microsoft Azure の TLS 1.3 サポート状況はどうなっているのかと気になりました。
Azure Update 更新履歴サイトで調べてみると、Application Gateway などいくつかのサービスで TLS 1.3 がサポートされたアップデートがアナウンスされていたことがわかりました。
しかし、Azure Front Door などの CDN サービスでサポートされた旨のアナウンスが見当たりませんでした。

そして公式ドキュメントを覗いてみたところ、本日時点のドキュメントからは次のように記述されており、サポートしているのかサポートしていないのかよくわからなくなりました。

Azure Front Door の TLS に関するドキュメント

こちらには TLS 1.3 がサポートされているように記述されています。

Supported TLS versions
Azure Front Door supports four versions of the TLS protocol: TLS versions 1.0, 1.1, 1.2 and 1.3. All Azure Front Door profiles created after September 2019 use TLS 1.2 as the default minimum with TLS 1.3 enabled

Azure Front Door の FAQ に関するドキュメント

しかし、FAQ ドキュメントでは Azure Front Door はまだ TLS 1.3 をサポートしていないとも記述されています。

What TLS versions are supported with Azure Front Door?
Front Door uses TLS 1.2 as the minimum version for all profiles created after September 2019.

You can choose to use TLS 1.0, 1.1 or 1.2 with Front Door, but TLS 1.3 isn't supported yet. To learn more, read the Azure Front Door end-to-end TLS article.

Azure Front Door で検証してみることに

うーん、ドキュメントからだとよくわからないなぁということで実際に動作検証してみることにしました。
Azure Front Door で適当な外部 Web サイトをオリジンに指定します。
オリジン構成によってフロントの TLS サポート状況が異なる可能性もゼロではないなと思いつつ、特にドキュメントに明記されていなかったので今回はカスタムオリジンを使っています。

cURL で最低 TLS バージョンを 1.3 で指定してリクエストを送信してみます。
1.3 をサポートしていない場合はエラーとなるはず。

adminiwasa [ ~ ]$ curl -v -s --tlsv1.3 https://hoge0219frontdoor-cvhpd0hmbhcugyex.z02.azurefd.net/ > /dev/null
* Host hoge0219frontdoor-cvhpd0hmbhcugyex.z02.azurefd.net:443 was resolved.
* IPv6: 2620:1ec:bdf::59, 2620:1ec:46::59
* IPv4: 13.107.213.59, 13.107.246.59
*   Trying 13.107.213.59:443...
* Connected to hoge0219frontdoor-cvhpd0hmbhcugyex.z02.azurefd.net (13.107.213.59) port 443
* ALPN: curl offers h2,http/1.1
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
*  CAfile: /etc/pki/tls/certs/ca-bundle.trust.crt
*  CApath: /etc/ssl/certs
{ [5 bytes data]
* TLSv1.3 (IN), TLS alert, protocol version (582):
{ [2 bytes data]
* OpenSSL/1.1.1k: error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version
* Closing connection

1409442Eのエラーが発生していますね。サーバーが TLS 1.3 をサポートしていないことがわかります。

「なんだ、ドキュメントの記述よくわからないが、サポートされていないんだな」そう思ったのですが、もう一度リクエストを送信してみると...

adminiwasa [ ~ ]$ curl -v -s --tlsv1.3 https://hoge0219frontdoor-cvhpd0hmbhcugyex.z02.azurefd.net/ > /dev/null
* Host hoge0219frontdoor-cvhpd0hmbhcugyex.z02.azurefd.net:443 was resolved.
* IPv6: 2620:1ec:bdf::59, 2620:1ec:46::59
* IPv4: 13.107.246.59, 13.107.213.59
*   Trying 13.107.246.59:443...
* Connected to hoge0219frontdoor-cvhpd0hmbhcugyex.z02.azurefd.net (13.107.246.59) port 443
* ALPN: curl offers h2,http/1.1
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
*  CAfile: /etc/pki/tls/certs/ca-bundle.trust.crt
*  CApath: /etc/ssl/certs
{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [88 bytes data]
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [187 bytes data]
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
{ [19 bytes data]
* TLSv1.3 (IN), TLS handshake, Certificate (11):
{ [3846 bytes data]
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
{ [264 bytes data]
* TLSv1.3 (IN), TLS handshake, Finished (20):
{ [52 bytes data]
* TLSv1.3 (OUT), TLS handshake, Finished (20):
} [52 bytes data]
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 / [blank] / UNDEF
* ALPN: server accepted h2
* Server certificate:

:

あれ、TLS 1.3 での接続が行われている... なんだこれは。
その後何度かリクエストを送信してみると、不規則に TLS 1.3 での接続に成功したり失敗したりしていることに気が付きました。

adminiwasa [ ~ ]$ curl -v -s --tlsv1.3 https://hoge0219frontdoor-cvhpd0hmbhcugyex.z02.azurefd.net/ > /dev/null
* Host hoge0219frontdoor-cvhpd0hmbhcugyex.z02.azurefd.net:443 was resolved.
* IPv6: 2620:1ec:46::59, 2620:1ec:bdf::59
* IPv4: 13.107.213.59, 13.107.246.59
*   Trying 13.107.213.59:443...
* Connected to hoge0219frontdoor-cvhpd0hmbhcugyex.z02.azurefd.net (13.107.213.59) port 443
* ALPN: curl offers h2,http/1.1
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
*  CAfile: /etc/pki/tls/certs/ca-bundle.trust.crt
*  CApath: /etc/ssl/certs
{ [5 bytes data]
* TLSv1.3 (IN), TLS alert, protocol version (582):
{ [2 bytes data]
* OpenSSL/1.1.1k: error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version
* Closing connection

adminiwasa [ ~ ]$ curl -v -s --tlsv1.3 https://hoge0219frontdoor-cvhpd0hmbhcugyex.z02.azurefd.net/ > /dev/null
* Host hoge0219frontdoor-cvhpd0hmbhcugyex.z02.azurefd.net:443 was resolved.
* IPv6: 2620:1ec:46::59, 2620:1ec:bdf::59
* IPv4: 13.107.213.59, 13.107.246.59
*   Trying 13.107.213.59:443...
* Connected to hoge0219frontdoor-cvhpd0hmbhcugyex.z02.azurefd.net (13.107.213.59) port 443
* ALPN: curl offers h2,http/1.1
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
*  CAfile: /etc/pki/tls/certs/ca-bundle.trust.crt
*  CApath: /etc/ssl/certs
{ [5 bytes data]
* TLSv1.3 (IN), TLS alert, protocol version (582):
{ [2 bytes data]
* OpenSSL/1.1.1k: error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version
* Closing connection

adminiwasa [ ~ ]$ curl -v -s --tlsv1.3 https://hoge0219frontdoor-cvhpd0hmbhcugyex.z02.azurefd.net/ > /dev/null
* Host hoge0219frontdoor-cvhpd0hmbhcugyex.z02.azurefd.net:443 was resolved.
* IPv6: 2620:1ec:bdf::59, 2620:1ec:46::59
* IPv4: 13.107.246.59, 13.107.213.59
*   Trying 13.107.246.59:443...
* Connected to hoge0219frontdoor-cvhpd0hmbhcugyex.z02.azurefd.net (13.107.246.59) port 443
* ALPN: curl offers h2,http/1.1
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
*  CAfile: /etc/pki/tls/certs/ca-bundle.trust.crt
*  CApath: /etc/ssl/certs
{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [88 bytes data]
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [187 bytes data]
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
{ [19 bytes data]
* TLSv1.3 (IN), TLS handshake, Certificate (11):
{ [3846 bytes data]
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
{ [264 bytes data]
* TLSv1.3 (IN), TLS handshake, Finished (20):
{ [52 bytes data]
* TLSv1.3 (OUT), TLS handshake, Finished (20):
} [52 bytes data]
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 / [blank] / UNDEF

:

挙動からの推測ですが、Azure Front Door は複数のエッジサーバーへルーティングされるのですが、エッジサーバーによって TLS 1.3 のサポート状況が異なる雰囲気を感じます。

IP アドレスを指定してみます。

adminiwasa [ ~ ]$ nslookup hoge0219frontdoor-cvhpd0hmbhcugyex.z02.azurefd.net
Server:         168.63.129.16
Address:        168.63.129.16#53

Non-authoritative answer:
hoge0219frontdoor-cvhpd0hmbhcugyex.z02.azurefd.net      canonical name = shed.dual-low.part-0031.t-0009.t-msedge.net.
shed.dual-low.part-0031.t-0009.t-msedge.net     canonical name = part-0031.t-0009.t-msedge.net.
Name:   part-0031.t-0009.t-msedge.net
Address: 13.107.213.59
Name:   part-0031.t-0009.t-msedge.net
Address: 13.107.246.59
Name:   part-0031.t-0009.t-msedge.net
Address: 2620:1ec:46::59
Name:   part-0031.t-0009.t-msedge.net
Address: 2620:1ec:bdf::59

:

adminiwasa [ ~ ]$ curl -v -s --tlsv1.3 -H 'Host:hoge0219frontdoor-cvhpd0hmbhcugyex.z02.azurefd.net' https://13.107.213.59/ > /dev/null
*   Trying 13.107.213.59:443...
* Connected to 13.107.213.59 (13.107.213.59) port 443
* ALPN: curl offers h2,http/1.1
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [226 bytes data]
*  CAfile: /etc/pki/tls/certs/ca-bundle.trust.crt
*  CApath: /etc/ssl/certs
{ [5 bytes data]
* TLSv1.3 (IN), TLS alert, protocol version (582):
{ [2 bytes data]
* OpenSSL/1.1.1k: error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version
* Closing connection

:

adminiwasa [ ~ ]$ curl -v -s --tlsv1.3 -H 'Host:hoge0219frontdoor-cvhpd0hmbhcugyex.z02.azurefd.net' https://13.107.246.59/ > /dev/null
*   Trying 13.107.246.59:443...
* Connected to 13.107.246.59 (13.107.246.59) port 443
* ALPN: curl offers h2,http/1.1
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [226 bytes data]
*  CAfile: /etc/pki/tls/certs/ca-bundle.trust.crt
*  CApath: /etc/ssl/certs
{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [88 bytes data]
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [187 bytes data]
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
{ [15 bytes data]
* TLSv1.3 (IN), TLS handshake, Certificate (11):
{ [3729 bytes data]
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
{ [264 bytes data]
* TLSv1.3 (IN), TLS handshake, Finished (20):
{ [52 bytes data]
* TLSv1.3 (OUT), TLS handshake, Finished (20):
} [52 bytes data]
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 / [blank] / UNDEF

:

私の環境だと13.107.246.59は TLS 1.3 がサポートされており、13.107.213.59はサポートされていないように見えますね。
ドキュメント上 TLS 1.3 がサポートされているされていないで表記が混在していたり、もしかするとアップデートアナウンスされる前にカナリア的に一部サーバーに対してロールアウトされているのかもしれません。

ルールセットのプロトコルでは指定出来ない

Azure Front Door はリクエストをエッジでどのように処理するかのルールを設定することが出来ます。
条件に SSL プロトコルがあるのですが、こちらは本日時点では 1.0、1.1、1.2 がサポートされており、1.3 は使えませんでした。

Azure CDN Standard from Microsoft (クラシック) も Front Door と同じだった

Azure の CDN は Front Door 以外にもいくつか存在しているのですが、その中のひとつ Azure CDN Standard from Microsoft は公式ドキュメント上は TLS 1.3 が本日時点でサポートされていません。

こちらはどうなんだろうと思って、同じように検証してみました。

Azure CDN Standard from Microsoft も Front Door と同じ挙動ですね。

adminiwasa [ ~ ]$ nslookup hoge0219standard.azureedge.net
Server:         168.63.129.16
Address:        168.63.129.16#53

Non-authoritative answer:
hoge0219standard.azureedge.net  canonical name = hoge0219standard.afd.azureedge.net.
hoge0219standard.afd.azureedge.net      canonical name = azureedge-t-prod.trafficmanager.net.
azureedge-t-prod.trafficmanager.net     canonical name = shed.dual-low.part-0031.t-0009.t-msedge.net.
shed.dual-low.part-0031.t-0009.t-msedge.net     canonical name = part-0031.t-0009.t-msedge.net.
Name:   part-0031.t-0009.t-msedge.net
Address: 13.107.213.59
Name:   part-0031.t-0009.t-msedge.net
Address: 13.107.246.59
Name:   part-0031.t-0009.t-msedge.net
Address: 2620:1ec:46::59
Name:   part-0031.t-0009.t-msedge.net
Address: 2620:1ec:bdf::59

adminiwasa [ ~ ]$ curl -v -s --tlsv1.3 -H 'Host:hoge0219standard.azureedge.net' https://13.107.213.59/ > /dev/null
*   Trying 13.107.213.59:443...
* Connected to 13.107.213.59 (13.107.213.59) port 443
* ALPN: curl offers h2,http/1.1
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [226 bytes data]
*  CAfile: /etc/pki/tls/certs/ca-bundle.trust.crt
*  CApath: /etc/ssl/certs
{ [5 bytes data]
* TLSv1.3 (IN), TLS alert, protocol version (582):
{ [2 bytes data]
* OpenSSL/1.1.1k: error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version
* Closing connection

adminiwasa [ ~ ]$ curl -v -s --tlsv1.3 -H 'Host:hoge0219standard.azureedge.net' https://13.107.246.59/ > /dev/null
*   Trying 13.107.246.59:443...
* Connected to 13.107.246.59 (13.107.246.59) port 443
* ALPN: curl offers h2,http/1.1
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [226 bytes data]
*  CAfile: /etc/pki/tls/certs/ca-bundle.trust.crt
*  CApath: /etc/ssl/certs
{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [88 bytes data]
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [187 bytes data]
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
{ [15 bytes data]
* TLSv1.3 (IN), TLS handshake, Certificate (11):
{ [3729 bytes data]
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
{ [264 bytes data]
* TLSv1.3 (IN), TLS handshake, Finished (20):
{ [52 bytes data]
* TLSv1.3 (OUT), TLS handshake, Finished (20):
} [52 bytes data]
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 / [blank] / UNDEF

:

さいごに

本日は Azure Front Door の TLS 1.3 サポート状況がドキュメント上よくわからなかったので検証してみました。

結果としては TLS 1.3 で接続出来る時と出来ない時があり、接続先によって挙動が異なる状態であることがわかりました。
近いうちに TLS 1.3 が正式にサポートされる予兆なのかなとも思いつつ、ドキュメントが更新され始めているようなのでアナウンスを待ちたいと思います。