Appleのネットワーク設定で旧式のTLSを有効化

Appleのネットワーク設定で旧式のTLSを有効化

説明

Foundationの URLSessionConfiguration やSecurityフレームワークのプロトコルオプションで、最小バージョンをTLS 1.0やTLS 1.1にすると、古い接続先とこれらのバージョンを使用できるようになります。最大バージョンをTLS 1.0やTLS 1.1にすると、TLS 1.2とTLS 1.3は使用できません。

IETF BCP 195の一部であるRFC 8996は、TLS 1.0とTLS 1.1の使用を禁止しています。これらのバージョンには、現在推奨される暗号スイートやAEADのサポートが不十分で、ハンドシェイクの完全性や相手の認証をSHA-1ベースの仕組みに依存するなどの制約があります。ただし、最小バージョンが低いだけで、実際に旧式のバージョンを使用した、または攻撃者がダウングレードを強制したと断定はできません。サーバーが対応するバージョンと実際の通信経路も確認してください。

Appleプラットフォームの既定値

  • AppleはiOS 15、iPadOS 15、macOS 12、watchOS 8、tvOS 15から、TLS 1.0とTLS 1.1を非推奨にしました。
  • iOS 26またはmacOS 26以降にリンクされたアプリでは、URLSession とNetworkフレームワークの既定のTLS最小バージョンが1.0から1.2に変わりました。
  • App Transport Security(ATS)が適用される URLSession 接続では、既定でサーバーがTLS 1.2以降に対応している必要があります。ATSの例外を追加すると、この保護が弱まる場合があります。
  • Appleの2026年のプラットフォームセキュリティ文書では、OSがTLS 1.0とTLS 1.1にも対応すると記載されています。そのため、旧式のバージョンを明示した設定や、以前の環境にリンクされたアプリは、現在のOSでも確認が必要です。

すべてのApple OSで既定値が同じだと考えず、アプリのリンク対象、最小デプロイメントバージョン、ATSの例外、使用するネットワークAPIをまとめて確認してください。

想定される影響

  • 古い接続先との通信でTLS 1.0や1.1の旧式の暗号機能が使われ、保護が弱まるおそれがあります。
  • 最大バージョンを1.0や1.1に制限すると、新しいTLSだけを許可するサーバーに接続できなくなったり、古いサーバーへの依存が続いたりします。
  • 組織のポリシーやコンプライアンスで求められる、TLS 1.2以降という要件を満たせない場合があります。

対処方法

  1. TLS 1.0/1.1の設定を削除するか、最小バージョンを tls_protocol_version_t.TLSv12 にします。必要な接続先がすべて対応している場合は、TLS 1.3を優先します。
  2. 最大バージョンをTLS 1.2未満に制限しないでください。相互運用のために必要でなければ最大値を設定せず、新しいバージョンも選べるようにします。
  3. 新しいコードでは tlsMinimumSupportedProtocolVersion と sec_protocol_options_set_min_tls_protocol_version を使い、非推奨の SSLProtocol プロパティや sec_protocol_options_set_tls_min_version を追加しないでください。
  4. アプリ全体のポリシーを弱めず、古い接続先を更新するか、隔離した専用接続に分けます。例外には責任者、有効期限、許可する接続先を記録します。
  5. 配布済みのクライアントとサーバーを組み合わせてテストし、実際のエンドポイントがTLS 1.2または1.3だけを使用することを確認します。

例

変更前

swift
import Foundation
import Security
import class Foundation.URLSessionConfiguration

func configureLegacyTLS(
    _ configuration: Foundation.URLSessionConfiguration
) {
    configuration.tlsMinimumSupportedProtocolVersion = .TLSv10
    configuration.tlsMaximumSupportedProtocolVersion = .TLSv11
}

最小バージョンはTLS 1.0を許可し、最大バージョンはTLS 1.1に制限しています。この構成ではTLS 1.2やTLS 1.3を使用できません。

変更後

URLSession

swift
import Foundation
import Security

let configuration = URLSessionConfiguration.default
configuration.tlsMinimumSupportedProtocolVersion = .TLSv12
// 最大値は設定せず、TLS 1.3などの新しいバージョンも許可します。
let session = URLSession(configuration: configuration)

Networkフレームワーク

swift
import Network
import Security

let tlsOptions = NWProtocolTLS.Options()
sec_protocol_options_set_min_tls_protocol_version(
    tlsOptions.securityProtocolOptions,
    .TLSv12
)
let parameters = NWParameters(tls: tlsOptions)

最小バージョンを互換性のあるTLS 1.2にし、最大値を設定しなければ、接続先が対応している場合にTLS 1.3を使用できます。バージョンの設定とは別に、証明書チェーンとホスト名の検証も維持してください。

参考資料