Windows Server 2019 上で証明書バインドごとに使用できるようになった TLS バージョン適用機能TLS version enforcement capabilities now available per certificate binding on Windows Server 2019

この投稿の作成者This post is authored by

Andrew Marshall、主席セキュリティ プログラム マネージャー、顧客セキュリティおよび信頼Andrew Marshall, Principal Security Program Manager, Customer Security and Trust

Gabriel Montenegro、主席プログラム マネージャー、コア ネットワークGabriel Montenegro, Principal Program Manager, Core Networking

Niranjan Inamdar、シニア ソフトウェア エンジニア、コア ネットワークNiranjan Inamdar, Senior Software Engineer, Core Networking

Michael Brown、シニア ソフトウェア エンジニア、インターネット インフォメーション サービスMichael Brown, Senior Software Engineer, Internet Information Services

Ivan Pashov、主席ソフトウェア エンジニアリング リード、コア ネットワークIvan Pashov, Principal Software Engineering Lead, Core Networking

2019 年 8 月August 2019

世界中のエンジニアが TLS 1.0 への依存を排除する作業を行うときに、自身のセキュリティ ニーズと顧客の移行の準備状況のバランスをとるという複雑な課題が発生します。As engineers worldwide work to eliminate their own dependencies on TLS 1.0, they run into the complex challenge of balancing their own security needs with the migration readiness of their customers. これまで、Microsoft では、以前のオペレーティング システムへの TLS 1.2 サポートの追加、クライアントによる脆弱な TLS 使用状況を検出するための IIS での新しいログ記録形式の配布、および TLS 1.0 への依存を排除するための最新の技術ガイダンスの提供によって、これらの問題に対処するお客様を支援してきました。To date we have helped customers address these issues by adding TLS 1.2 support to older operating systems, by shipping new logging formats in IIS for detecting weak TLS usage by clients, as well as providing the latest technical guidance for eliminating TLS 1.0 dependencies.

今回、Microsoft では、TLS 1.2 以上への移行を簡単にする Windows の強力な新機能を発表しました。Now Microsoft is pleased to announce a powerful new feature in Windows to make your transition to a TLS 1.2+ world easier. KB4490481 以降、Windows Server 2019 では、指定した個々の証明書で脆弱な TLS バージョンが使用されるのをブロックできるようになりました。Beginning with KB4490481, Windows Server 2019 now allows you to block weak TLS versions from being used with individual certificates you designate. これは "レガシ TLS の無効化" と呼ばれる機能で、選択した証明書に TLS バージョンと暗号スイート フロアが効果的に適用されます。We call this feature “Disable Legacy TLS” and it effectively enforces a TLS version and cipher suite floor on any certificate you select.

レガシ TLS の無効化を使用すると、オンライン サービスでは同じハードウェア上に 2 つの異なるエンドポイント グループを提供することもできます。1 つは TLS 1.2 以上のトラフィックのみを許可し、もう 1 つは従来の TLS 1.0 トラフィックに対応します。Disable Legacy TLS also allows an online service to offer two distinct groupings of endpoints on the same hardware: one which allows only TLS 1.2+ traffic, and another which accommodates legacy TLS 1.0 traffic. 変更は HTTP.sys に実装され、追加の証明書の発行と共に、適切な TLS バージョンによる新しいエンドポイントへのトラフィックのルーティングが許可されます。The changes are implemented in HTTP.sys, and in conjunction with the issuance of additional certificates, allow traffic to be routed to the new endpoint with the appropriate TLS version. この変更が行われる前は、このような設定はレジストリを介してシステム全体でのみ構成可能だったため、このような機能をデプロイするには追加のハードウェア投資が必要でした。Prior to this change, deploying such capabilities would require an additional hardware investment because such settings were only configurable system-wide via registry.

機能のシナリオの詳細Feature scenario details

一般的なデプロイ シナリオでは、顧客のニーズが混在するデータセンター内に 1 つのハードウェア セットがあります。一部の顧客は TLS 1.2 を今すぐ最小として適用する必要があり、他の顧客は TLS 1.0 への依存を除去していません。A common deployment scenario features one set of hardware in a datacenter with customers of mixed needs: some need TLS 1.2 as an enforced minimum right now and others aren’t done removing TLS 1.0 dependencies. 図 1 は、個別のアクションとしての TLS バージョンの選択と証明書バインドを示しています。Figure 1 illustrates TLS version selection and certificate binding as distinctly separate actions. これは既定の機能です。This is the default functionality:

既定の TLS バージョンの選択

図 1: 既定の TLS バージョンの選択と証明書バインド機能Figure 1: Default TLS Version selection and Certificate Binding Functionality

  • では、TLS 1.2 以上だけをサポートするサービス エンドポイントに顧客を誘導します。 directs your customers to a service endpoint supporting only TLS 1.2 and above.

  • では、レガシ TLS 1.0 のニーズを持つ顧客 (TLS 1.2 にまだ移行中の顧客など) を、限られた期間だけ TLS 1.0 をサポートするエンドポイントに誘導します。 directs customers with legacy TLS 1.0 needs (like those still migrating to TLS 1.2) to an endpoint which supports TLS 1.0 for a limited time. これにより、顧客はサービス中断なしで TLS 1.2 の準備状況のテストを完了できます。TLS 1.2 の準備ができている他の顧客をブロックすることはありません。This allows customers to finish readiness testing for TLS 1.2 without service disruption and without blocking other customers who are ready for TLS 1.2.

従来、すべてのトラフィックを処理し、TLS バージョンの適用を実現するには、2 つの物理的に独立したホストが必要でした。最小プロトコル バージョンで TLS 要求を処理するには、システム全体のレジストリ設定を介して脆弱なプロトコルを無効にする必要があるからです。Traditionally, you’d need two physically separate hosts to handle all the traffic and provide for TLS version enforcement, as servicing TLS requests with a minimum protocol version requires disabling weaker protocols via system-wide registry settings. TLS セッションが証明書にバインドされているスタックの上部でこの機能を使用できるようになったため、以下の図 2 に示すように、特定の最小 TLS バージョンを割り当てることができます。We have made this functionality available higher up the stack, where the TLS session is bound to the certificate, so a specific minimum TLS version can be assigned as described in Figure 2 below.

選択した証明書への最低限の TLS バージョンの適用

図 2:選択した証明書 ( に最小 TLS バージョンを適用するレガシ TLS の無効化機能。Figure 2: Disable Legacy TLS feature enforcing minimum TLS version for a selected certificate,

機能デプロイ ガイダンスFeature deployment guidance

レガシ TLS の無効化機能は、インターネット インフォメーション サービス (IIS) サーバー UI、PowerShell コマンドまたは C++ HTTP.sys API を使用してデプロイできます。The Disable Legacy TLS feature can be deployed through the Internet Information Services (IIS) Server UI, via PowerShell commands or C++ HTTP.sys APIs.

オプション #1:IIS UI 構成 (2020 年 4 月から利用可能)Option #1: IIS UI configuration (Available April 2020)

次に示すように、SSL 証明書 "" のサイト バインドを作成し、[Disable Legacy TLS](レガシ TLS を無効にする) をオンにして、[OK] をクリックします。Create a site binding for the SSL Certificate “” as shown below, then check “Disable Legacy TLS” and click OK.


オプション #2:PowerShell (2020 年 4 月から利用可能)Option #2: PowerShell (Available April 2020)

PowerShell では、次のように SSL フラグを参照できます。In PowerShell you can reference SSL flags like this:


短い名前の変数を作成すると便利です。It’s convenient to create shorter named variables for them:

$Sni = [Microsoft.Web.Administration.SslFlags]::Sni

$Sni\_CCS = [Microsoft.Web.Administration.SslFlags]::Sni + [Microsoft.Web.Administration.SslFlags]::CentralCertStore

$CCS = [Microsoft.Web.Administration.SslFlags]::CentralCertStore

$DisableLegacyTLS = [Microsoft.Web.Administration.SslFlags]::DisableLegacyTLS

$storeLocation = "Cert:\\LocalMachine\\My"

新しいサイトへのサイト バインドを作成し、レガシ TLS を無効にする例:An example of creating a site binding to a new site and disabling legacy TLS:

$BindingInformation = "\*:443:"

$siteName = "contoso"

$Thumbprint = $certificate.ThumbPrint

Sslflag DisableLegacyTLS プロパティ値が指定された New-IISSiteNew-IISSite with Sslflag DisableLegacyTLS property value:

New-IISSite $siteName "$env:systemdrive\\inetpub\\wwwroot" "\*" https $certificate.Thumbprint $DisableLegacyTLS $storeLocation -passthru

既存のサイトにサイト バインドを追加し、レガシ TLS を無効にする例:An example of adding a site binding to an existing site and disabling legacy TLS:

New-IISSiteBinding -Name "Default Web Site" -BindingInformation $BindingInformation -CertificateThumbPrint $certificate.Thumbprint -Protocol https -SslFlag $DisableLegacyTLS, $CCS -Force -verbose

さらに、Netsh を使用してこの機能のトラブルシューティングとテストを行うことができます。Additionally, one can troubleshoot and test this feature with Netsh:

  • 新しいバインドの追加:Adding a new binding:

    netsh http add sslcert <通常のパラメーター> disablelegacytls=enablenetsh http add sslcert <regular parameters> disablelegacytls=enable

  • 既存のバインドの更新:Updating an existing binding:

    netsh http update sslcert <通常のパラメーター> disablelegacytls=enablenetsh http update sslcert <regular parameters> disablelegacytls=enable

  • バインディングに設定されているかどうかの確認:Check whether it is set on a binding:

    netsh http show sslcert <通常のパラメーター>netsh http show sslcert <regular parameters>

    レガシ TLS バージョンの無効化の監視:設定/未設定Watch for Disable Legacy TLS Versions  : Set/Not Set

オプション #3:C++ HTTP.sys APIs (現在利用可能)Option #3: C++ HTTP.sys APIs (Available Now)

レガシ TLS の無効化と共に、HTTP.sys には次の追加が行われています。Along with Disable Legacy TLS, the following additions have been made to HTTP.sys:

  • HTTP_SERVICE_CONFIG_SSL_PARAM.DefaultFlags では、次の新しい値がサポートされるようになりました。HTTP_SERVICE_CONFIG_SSL_PARAM.DefaultFlags now supports the following new values:

  • HTTP_SERVICE_CONFIG_SSL_FLAG_ENABLE_SESSION_TICKET: 特定の SSL エンドポイントに対してセッション チケットを有効/無効にします。HTTP_SERVICE_CONFIG_SSL_FLAG_ENABLE_SESSION_TICKET: Enable/Disable Session Ticket for a particular SSL endpoint.

  • HTTP_SERVICE_CONFIG_SSL_FLAG_LOG_EXTENDED_EVENTS:特定の SSL エンドポイントに対して拡張イベント ログを有効/無効にします。HTTP_SERVICE_CONFIG_SSL_FLAG_LOG_EXTENDED_EVENTS : Enable/Disable extended event logging for a particular SSL endpoint. 追加のイベントは Windows イベント ログに記録されます。Additional events are logged to Windows Event Log. 現時点でサポートされているイベントは 1 つだけで、SSL ハンドシェイクが失敗したときにログに記録されます。There is only one event supported as of now which is logged when the SSL handshake fails.

  • HTTP_SERVICE_CONFIG_SSL_FLAG_DISABLE_LEGACY_TLS:特定の SSL エンドポイントに対してレガシ TLS バージョンを有効/無効にします。HTTP_SERVICE_CONFIG_SSL_FLAG_DISABLE_LEGACY_TLS: Enable/Disable legacy TLS versions for a particular SSL endpoint. このフラグを設定すると、そのエンドポイントに対して TLS 1.0/1.1 が無効になり、使用できる暗号スイートも HTTP2 暗号スイートに制限されます。Setting this flag will disable TLS1.0/1.1 for that endpoint and will also restrict cipher suites that can be used to HTTP2 cipher suites.

  • HTTP_SERVICE_CONFIG_SSL_FLAG_DISABLE_TLS12: 特定の SSL エンドポイントに対して TLS1.2 を有効/無効にします。HTTP_SERVICE_CONFIG_SSL_FLAG_DISABLE_TLS12 : Enable/Disable TLS1.2 for a particular SSL endpoint.

  • HTTP_SERVICE_CONFIG_SSL_FLAG_DISABLE_HTTP2:特定の SSL エンドポイントに対して HTTP/2 を有効/無効にします。HTTP_SERVICE_CONFIG_SSL_FLAG_DISABLE_HTTP2: Enable/Disable HTTP/2 for a particular SSL endpoint.

C++ で証明書ごとにこの機能を有効/無効にする最も簡単な方法は、HttpSetServiceConfiguration HTTP.sys API によって提供されている HTTP_SERVICE_CONFIG_SSL_FLAG_DISABLE_LEGACY_TLS フラグを使用することです。The simplest way to enable/disable this functionality per certificate in C++ is with the HTTP_SERVICE_CONFIG_SSL_FLAG_DISABLE_LEGACY_TLS flag provided by the HttpSetServiceConfiguration HTTP.sys API.

[Disable Legacy TLS](レガシ TLS を無効にする) が設定されている場合は、次の制限が適用されます。When Disable Legacy TLS is set, the following restrictions are enforced:

  • SSL2、SSL3、TLS 1.0、および TLS 1.1 プロトコルが無効になります。Disable SSL2, SSL3, TLS1.0 and TLS1.1 protocols.

  • 暗号化用の暗号 DES、3DES、および RC4 が無効になります (したがって、AES のみが使用されます)。Disable encryption ciphers DES, 3DES, and RC4 (so only AES is used).

  • CBC チェーン モードでの暗号化用の暗号 AES が無効になります (したがって、AES GCM のみが使用されます)。Disable encryption cipher AES with CBC chaining mode (so only AES GCM is used).

  • RSA キーの交換が無効になります。Disable RSA key exchange.

  • キー サイズが 2048 未満の DH キー交換が無効になります。Disable DH key exchange with key size less than 2048.

  • キー サイズが 224 未満の ECDH キー交換が無効になります。Disable ECDH key exchanges with key size less than 224. でのこれらの変更に関する公式ドキュメントは、近日公開予定です。Official documentation of these changes on is forthcoming.

TLS バージョンを適用するための次の手順Next steps for TLS version enforcement

レガシ TLS の無効化では、特定の証明書バインドおよびエンドポイント バインドに TLS バージョンまたは暗号スイートを適用するための強力な新機能が提供されます。Disable Legacy TLS provides powerful new capabilities for enforcing TLS version/cipher suite floors on specific certificate/endpoint bindings. この機能を有効にして発行された証明書の名前付けを計画する必要もあります。It also requires you to plan out the naming of the certificates issued with this functionality enabled. 考慮事項の一部を次に示します。Some of the considerations include:

  • TLS 1.2 を今すぐ適用するために既定のパスを自分のサービス エンドポイントに設定する必要があるか。また、TLS 1.0 を必要とするユーザーのバックアップ "レガシ" アクセス ポイントとして別の証明書を提供するか。Do I want the default path to my service endpoint to enforce TLS 1.2 today, and provide a different certificate as a backup “legacy” access point for users who need TLS 1.0?

  • 既に使用している既定の 証明書でレガシ TLS の無効化を使用するか。Should my default, already-in-use certification use Disable Legacy TLS? その場合は、 証明書を提供し、TLS 1.0 を許可するエンドポイントにバインドすることが必要になる可能性があります。If so, I may need to provide a certificate and bind it to an endpoint allowing TLS 1.0.

  • これらの証明書の推奨される使用方法を顧客に伝えるには、どうするのが最適か。How can I best communicate the recommended usage of these certificates to my customers?

この機能を活用して、大規模な顧客グループ (TLS 1.2+ を使用する義務を負う顧客と、まだ TLS 1.0 からの移行の作業中である顧客) のニーズを満たすことができます。追加のハードウェア費用は不要です。You can leverage this feature to meet the needs of large groups of customers – those with an obligation to use TLS 1.2+, and those still working on the migration away from TLS 1.0, all without additional hardware expenditure. Microsoft では、Windows Server 2019 での証明書ごとの TLS バージョン バインドの現在の可用性に加えて、お客様の要求に基づいて、オンライン サービス全体でレガシ TLS の無効化を使用可能にすることを検討しています。In addition to today’s availability of per-certificate TLS version binding in Windows Server 2019, Microsoft will look to make Disable Legacy TLS available across its online services based on customer demand.