Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 17681] ファイルの概要

このコミットは、Go言語のcrypto/tlsパッケージにおけるドキュメンテーションの更新に関するものです。具体的には、TLSプロトコルのサポートバージョンに関する記述をTLS 1.1からTLS 1.2へ変更しています。これは、GoのTLS実装が既にTLS 1.2をサポートしているにもかかわらず、ドキュメントが古い情報(TLS 1.1)を記載していたため、その不整合を解消するための修正です。

コミット

commit bc2c3388f4ead47c1344a061d305cc9f535af987
Author: Russ Cox <rsc@golang.org>
Date:   Mon Sep 23 16:05:23 2013 -0400

    crypto/tls: document that the package supports TLS 1.2
    
    Fixes #6456.
    
    R=golang-dev, bradfitz
    CC=golang-dev
    https://golang.org/cl/13740047

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/bc2c3388f4ead47c1344a061d305cc9f535af987

元コミット内容

crypto/tls: document that the package supports TLS 1.2 Fixes #6456.

R=golang-dev, bradfitz CC=golang-dev https://golang.org/cl/13740047

変更の背景

このコミットの背景には、Go言語のcrypto/tlsパッケージが既にTLS 1.2プロトコルを内部的にサポートしていたにもかかわらず、その事実が公式ドキュメントに反映されていなかったという状況があります。開発者は、パッケージの機能とドキュメントの間に不整合があることを認識し、ユーザーが最新の情報を得られるようにドキュメントを修正する必要がありました。

コミットメッセージにあるFixes #6456は、この変更が特定の課題(Issue 6456)を解決することを示唆していますが、Goの公式Issue Trackerでは直接該当するIssueは見つかりませんでした。これは、内部的なトラッキング番号であるか、あるいは別のシステムで管理されていた可能性が考えられます。しかし、変更内容から判断すると、主な目的はドキュメントの正確性を向上させることにあります。

TLS 1.2は、TLS 1.1に比べてセキュリティとパフォーマンスが向上しており、より新しい標準として広く採用され始めていた時期でした。そのため、GoのTLS実装がこの新しいバージョンをサポートしていることを明確にすることは、ユーザーにとって重要な情報であり、Goのセキュリティ機能の信頼性を示す上でも意味がありました。

前提知識の解説

TLS (Transport Layer Security)

TLSは、インターネット上で安全な通信を行うための暗号化プロトコルです。ウェブブラウジング(HTTPS)、電子メール、VoIPなど、様々なアプリケーションで利用されています。TLSは、以下の主要な機能を提供します。

  1. 認証: 通信相手が主張するエンティティであることを確認します。通常、サーバーはデジタル証明書を提示して自身の身元を証明します。
  2. 機密性: 通信内容が第三者に傍受されても解読されないように暗号化します。
  3. 完全性: 通信内容が転送中に改ざんされていないことを保証します。

TLSプロトコルは、ハンドシェイクプロトコルとレコードプロトコルの2つの主要な層で構成されています。

  • ハンドシェイクプロトコル: クライアントとサーバーが通信を開始する際に、互いの認証、暗号スイート(使用する暗号アルゴリズムの組み合わせ)のネゴシエーション、セッションキーの生成などを行います。
  • レコードプロトコル: ハンドシェイクで確立されたセキュアなチャネルを通じて、アプリケーションデータを送受信します。

TLS 1.1 (RFC 4346)

TLS 1.1は、2006年4月にRFC 4346として公開されました。これはTLS 1.0 (RFC 2246) の後継バージョンであり、主にセキュリティの脆弱性に対処するために導入されました。主な改善点としては、CBC (Cipher Block Chaining) モードの攻撃に対する保護強化(明示的な初期化ベクトル (IV) の導入など)が挙げられます。しかし、現在ではTLS 1.1もセキュリティ上の懸念から非推奨とされており、主要なブラウザやサービスではサポートが終了しています。

TLS 1.2 (RFC 5246)

TLS 1.2は、2008年8月にRFC 5246として公開されました。これはTLS 1.1の次のバージョンであり、暗号化の強度と柔軟性を大幅に向上させました。TLS 1.2の主な特徴と改善点は以下の通りです。

  • ハッシュ関数の強化: 以前のバージョンで使われていたMD5とSHA-1の組み合わせに代わり、SHA-256が必須となり、より強力なハッシュアルゴリズムが利用可能になりました。これにより、メッセージ認証コード(MAC)や擬似乱数関数(PRF)のセキュリティが向上しました。
  • 暗号スイートの拡張: 認証付き暗号(AEAD: Authenticated Encryption with Associated Data)モード、特にAES-GCM (Galois/Counter Mode) のサポートが追加されました。これにより、暗号化と認証を同時に行うことができ、パフォーマンスとセキュリティが向上しました。
  • 柔軟なアルゴリズム選択: クライアントとサーバーが、より柔軟にハッシュアルゴリズムや署名アルゴリズムを選択できるようになりました。
  • アプリケーションプロトコル独立性: TLSはアプリケーションプロトコルから独立しており、HTTP、FTP、SMTPなど、様々な上位プロトコルで利用できます。

TLS 1.2は長らくインターネットの主要なセキュリティプロトコルとして広く利用されてきましたが、現在ではTLS 1.3 (RFC 8446) が最新の標準となっています。しかし、TLS 1.2は依然として多くのシステムでサポートされており、TLS 1.3をサポートしないクライアントやサーバーとの互換性のために重要な役割を果たしています。

Go言語のcrypto/tlsパッケージ

Go言語の標準ライブラリに含まれるcrypto/tlsパッケージは、TLSプロトコルを部分的に実装し、安全なネットワーク通信機能を提供します。このパッケージを使用することで、開発者はTLSクライアントやサーバーを簡単に構築できます。Config構造体を通じて、TLSのバージョン、証明書、鍵、暗号スイートなどの様々な設定をカスタマイズできます。

技術的詳細

このコミットは、Go言語のcrypto/tlsパッケージ内の2つのファイル、src/pkg/crypto/tls/common.gosrc/pkg/crypto/tls/tls.goのドキュメンテーションを更新しています。

変更の技術的な本質は、コードの動作を変更するものではなく、ドキュメントの正確性を向上させることにあります。具体的には、GoのTLS実装が既にTLS 1.2をサポートしているという事実を反映させるために、コメント内の記述を修正しています。

common.goでは、Config構造体のMaxVersionフィールドに関するコメントが修正されています。このフィールドは、許容されるSSL/TLSの最大バージョンを指定するもので、ゼロの場合はパッケージがサポートする最大バージョンが使用されると説明されています。修正前は「現在TLS 1.1」と記述されていましたが、修正後は「現在TLS 1.2」に変更されています。これは、Goのcrypto/tlsパッケージが内部的にTLS 1.2をサポートしていることを明示するものです。

tls.goでは、パッケージ全体の概要を説明するコメントが修正されています。修正前は「Package tls partially implements TLS 1.1, as specified in RFC 4346.」と記述されていましたが、修正後は「Package tls partially implements TLS 1.2, as specified in RFC 4346.」に変更されています。ここで参照されているRFC 4346はTLS 1.1の仕様ですが、コメントの意図はGoのTLSパッケージがTLS 1.2を実装していることを示すことです。厳密にはTLS 1.2はRFC 5246で定義されているため、このコメントは「RFC 5246」とすべきですが、当時のGoのドキュメンテーションの慣習や、TLS 1.2がTLS 1.1の拡張であるという文脈でRFC 4346を参照していた可能性も考えられます。しかし、重要なのは、GoのTLS実装がTLS 1.2をサポートしているという事実を明確にすることです。

この変更は、GoのTLS実装がセキュリティと互換性の面で進化していることを示唆しています。TLS 1.2のサポートは、より強力な暗号化アルゴリズムと改善されたセキュリティ機能を利用できることを意味し、Goアプリケーションのセキュリティを向上させます。

コアとなるコードの変更箇所

このコミットによるコードの変更は、以下の2つのファイルにおけるコメントの修正のみです。

  1. src/pkg/crypto/tls/common.go

    --- a/src/pkg/crypto/tls/common.go
    +++ b/src/pkg/crypto/tls/common.go
    @@ -248,7 +248,7 @@ type Config struct {
     
     	// MaxVersion contains the maximum SSL/TLS version that is acceptable.
     	// If zero, then the maximum version supported by this package is used,
    -	// which is currently TLS 1.1.
    +	// which is currently TLS 1.2.
     	MaxVersion uint16
     
     	serverInitOnce sync.Once // guards calling (*Config).serverInit
    
  2. src/pkg/crypto/tls/tls.go

    --- a/src/pkg/crypto/tls/tls.go
    +++ b/src/pkg/crypto/tls/tls.go
    @@ -2,7 +2,7 @@
     // Use of this source code is governed by a BSD-style
     // license that can be found in the LICENSE file.
     
    -// Package tls partially implements TLS 1.1, as specified in RFC 4346.
    +// Package tls partially implements TLS 1.2, as specified in RFC 4346.
     package tls
     
     import (
    

コアとなるコードの解説

src/pkg/crypto/tls/common.goの変更

Config構造体は、TLS接続の設定を定義するために使用されます。その中のMaxVersionフィールドは、クライアントまたはサーバーが許容するTLSプロトコルの最大バージョンを指定します。このフィールドのコメントは、MaxVersionがゼロの場合にパッケージがサポートする最大バージョンが使用されることを説明しています。

変更前: // which is currently TLS 1.1. 変更後: // which is currently TLS 1.2.

この変更は、Goのcrypto/tlsパッケージが、MaxVersionが明示的に設定されていない場合に、デフォルトでTLS 1.2を最大バージョンとして使用するようになったことをドキュメント上で明確にしています。これは、GoのTLS実装が内部的にTLS 1.2をサポートしているという事実を反映したものであり、ユーザーが最新のセキュリティプロトコルを利用できることを示唆しています。

src/pkg/crypto/tls/tls.goの変更

このファイルはcrypto/tlsパッケージの主要なエントリポイントの一つであり、パッケージの概要を説明するコメントが含まれています。

変更前: // Package tls partially implements TLS 1.1, as specified in RFC 4346. 変更後: // Package tls partially implements TLS 1.2, as specified in RFC 4346.

この変更は、crypto/tlsパッケージが部分的にTLS 1.2を実装していることを明示しています。元のコメントではTLS 1.1 (RFC 4346) を参照していましたが、GoのTLS実装が進化し、TLS 1.2の機能を取り込んだため、ドキュメントもそれに合わせて更新されました。

ここで注意すべき点は、TLS 1.2の公式な仕様はRFC 5246であるにもかかわらず、コメントが引き続きRFC 4346(TLS 1.1の仕様)を参照している点です。これは、TLS 1.2がTLS 1.1の拡張として位置づけられていたため、あるいは単にドキュメントの更新時にRFC番号の修正が見落とされた可能性が考えられます。しかし、このコメントの主要な目的は、パッケージがTLS 1.2をサポートしているという事実を伝えることであり、その点では目的を達成しています。

全体として、これらの変更はGoのcrypto/tlsパッケージがより新しい、よりセキュアなTLSプロトコルバージョンをサポートしていることをユーザーに知らせるための重要なドキュメンテーションの更新です。

関連リンク

参考にした情報源リンク