説明
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以降という要件を満たせない場合があります。
対処方法
- TLS 1.0/1.1の設定を削除するか、最小バージョンを
tls_protocol_version_t.TLSv12にします。必要な接続先がすべて対応している場合は、TLS 1.3を優先します。 - 最大バージョンをTLS 1.2未満に制限しないでください。相互運用のために必要でなければ最大値を設定せず、新しいバージョンも選べるようにします。
- 新しいコードでは
tlsMinimumSupportedProtocolVersionとsec_protocol_options_set_min_tls_protocol_versionを使い、非推奨のSSLProtocolプロパティやsec_protocol_options_set_tls_min_versionを追加しないでください。 - アプリ全体のポリシーを弱めず、古い接続先を更新するか、隔離した専用接続に分けます。例外には責任者、有効期限、許可する接続先を記録します。
- 配布済みのクライアントとサーバーを組み合わせてテストし、実際のエンドポイントが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を使用できます。バージョンの設定とは別に、証明書チェーンとホスト名の検証も維持してください。
参考資料
- Apple:
URLSessionConfiguration.tlsMinimumSupportedProtocolVersion - Apple: SecurityフレームワークのTLSプロトコルオプション
- Apple:
sec_protocol_options_set_min_tls_protocol_version - Apple: TLS 1.0と1.1の非推奨化のお知らせ
- Apple: macOS 26リリースノート
- Appleプラットフォームセキュリティ: TLSのセキュリティ
- CodeQL: 安全でないTLS設定
- RFC 8996: TLS 1.0とTLS 1.1の非推奨化
- NIST SP 800-52 Rev. 2
- CWE-757: ネゴシエーション時の安全性が低いアルゴリズムの選択
- OWASP Top 10:2025 A04 暗号化の失敗