[インデックス 17461] ファイルの概要
このコミットは、Go言語の標準ライブラリ crypto/x509
および crypto/tls
パッケージにおける重要な変更点を、doc/go1.2.txt
というGo 1.2リリースノートのドキュメントに追記するものです。具体的には、TLSプロトコルの新バージョン(TLS 1.1、TLS 1.2)と、新しい暗号スイート(AES-GCM)のサポート、そしてX.509証明書における任意の拡張機能の読み書きサポートに関する記述が追加されています。
コミット
commit 3fca983872ce86e1d73cce4ac0554a5a404fc28c
Author: Adam Langley <agl@golang.org>
Date: Tue Sep 3 16:19:41 2013 -0400
doc/go1.2.txt: crypto/{x509,tls} changes
R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/13335050
---
doc/go1.2.txt | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/doc/go1.2.txt b/doc/go1.2.txt
index 8337e31dcb..11b7b9e12e 100644
--- a/doc/go1.2.txt
+++ b/doc/go1.2.txt
@@ -40,7 +40,8 @@ crypto/md5: Sum function to simplify hashing (CL10624044).
crypto/sha1: Sum function to simplify hashing (CL 10571043).
crypto/sha256: Sum256 and Sum224 functions to simplify hashing (CL 10629043).
crypto/sha512: Sum512 and Sum384 functions to simplify hashing (CL 10630043).
-crypto/tls: add support for TLS 1.1. (CL 7872043).
+crypto/x509: add support for reading and writing arbitrary extensions (CL 12056043).
+crypto/tls: add support for TLS 1.1, 1.2 and AES-GCM. (CL 7872043, 10762044 and 13249044).
database/sql: add SetMaxOpenConns method on DB (CL 10726044).
encoding: new package defining generic encoding interfaces (CL 12541051).
encoding/csv: always allow trailing commas (CL 12294043).
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/3fca983872ce86e1d73cce4ac0554a5a404fc28c
元コミット内容
このコミット自体は、Go 1.2のリリースノート (doc/go1.2.txt
) を更新するものです。元のコミットメッセージは「doc/go1.2.txt: crypto/{x509,tls} changes」であり、crypto/x509
と crypto/tls
パッケージにおける変更点をドキュメントに反映させることを目的としています。
具体的には、以下の2行が変更されています。
crypto/tls: add support for TLS 1.1. (CL 7872043).
が削除され、より詳細な記述に置き換えられています。crypto/x509: add support for reading and writing arbitrary extensions (CL 12056043).
が追加されています。crypto/tls: add support for TLS 1.1, 1.2 and AES-GCM. (CL 7872043, 10762044 and 13249044).
が追加されています。
これは、Go 1.2リリースに向けて、これらのセキュリティ関連機能がGoの標準ライブラリに組み込まれたことを公式にアナウンスするためのドキュメント更新です。
変更の背景
この変更の背景には、インターネットにおけるセキュリティプロトコルの進化と、それに対応するGo言語の標準ライブラリの強化があります。
-
TLSプロトコルの進化:
- TLS (Transport Layer Security) は、インターネット上で安全な通信を行うための暗号化プロトコルです。TLS 1.0は古く、既知の脆弱性(例: BEAST攻撃)が存在していました。
- TLS 1.1はTLS 1.0の脆弱性を修正し、セキュリティを向上させたバージョンです。
- TLS 1.2はさらにセキュリティを強化し、より強力なハッシュアルゴリズム(SHA-256など)や暗号スイート(AES-GCMなど)をサポートしています。当時、TLS 1.2は最新かつ最も推奨されるバージョンであり、より安全な通信を実現するためにそのサポートが不可欠でした。
- Go言語がこれらの新しいTLSバージョンをサポートすることで、Goで開発されたアプリケーションがより安全な通信を提供できるようになります。
-
AES-GCM暗号スイートの重要性:
- AES-GCM (Galois/Counter Mode) は、認証付き暗号(Authenticated Encryption with Associated Data, AEAD)モードの一種であり、データの機密性(暗号化)と完全性・認証(改ざん検知)を同時に提供します。従来のCBCモードなどと比較して、より安全で効率的な暗号化方式として広く採用されていました。
- TLS 1.2では、AES-GCMが主要な暗号スイートとして推奨されており、そのサポートはTLS 1.2の実用性を高める上で重要でした。
-
X.509証明書の拡張機能の柔軟性:
- X.509証明書は、公開鍵インフラストラクチャ (PKI) において、エンティティの公開鍵を識別し、その正当性を証明するために使用されます。
- X.509証明書には、標準的なフィールドの他に「拡張機能 (Extensions)」と呼ばれる領域があり、これによって証明書に様々な追加情報を埋め込むことができます(例: Subject Alternative Name, Key Usage, Extended Key Usageなど)。
- しかし、標準で定義されていない「任意の拡張機能」を扱う必要が生じる場合があります。例えば、特定のアプリケーションや組織内で利用されるカスタムな情報を含めたい場合などです。
- Goの
crypto/x509
パッケージが任意の拡張機能の読み書きをサポートすることで、より多様なX.509証明書を扱うことが可能になり、Go言語のPKI関連機能の柔軟性と互換性が向上します。
これらの変更は、Go言語が当時の最新のセキュリティ標準に追従し、開発者がより安全で堅牢なネットワークアプリケーションを構築できるようにするための重要なステップでした。
前提知識の解説
このコミットの技術的詳細を理解するためには、以下の前提知識が必要です。
-
TLS (Transport Layer Security):
- インターネット上でクライアントとサーバー間の通信を暗号化し、認証を行うためのプロトコル。SSL (Secure Sockets Layer) の後継。
- バージョン: TLS 1.0, 1.1, 1.2, 1.3などがあり、バージョンが上がるごとにセキュリティが強化され、古い脆弱性が修正される。
- ハンドシェイク: クライアントとサーバーが通信を開始する際に、暗号化アルゴリズムのネゴシエーション、鍵交換、認証(証明書の使用)を行うプロセス。
- 暗号スイート (Cipher Suite): TLSハンドシェイク中に合意される、鍵交換アルゴリズム、認証アルゴリズム、暗号化アルゴリズム、ハッシュアルゴリズムの組み合わせ。例:
TLS_RSA_WITH_AES_128_GCM_SHA256
。
-
X.509 証明書:
- 公開鍵インフラストラクチャ (PKI) において、公開鍵の所有者を識別し、その公開鍵が正当なものであることを証明するために使用されるデジタル証明書の標準フォーマット。
- 証明書チェーン: ルート認証局 (CA) から中間CA、そしてエンドエンティティ証明書へと連なる信頼の階層。
- 拡張機能 (Extensions): X.509証明書のバージョン3で導入された機能で、証明書に標準的なフィールド以外の追加情報を含めることができる。例:
Subject Alternative Name (SAN)
: 証明書がカバーする追加のドメイン名やIPアドレス。Key Usage
: 証明書の公開鍵が何のために使われるか(例: デジタル署名、鍵の暗号化)。Extended Key Usage
: 証明書が特定のアプリケーションでどのように使われるか(例: サーバー認証、クライアント認証)。- 任意の拡張機能: 標準で定義されていない、カスタムのOID (Object Identifier) を持つ拡張機能。
-
AES-GCM (Advanced Encryption Standard - Galois/Counter Mode):
- AES: 共通鍵暗号方式の標準。ブロック暗号であり、データを固定長のブロックに分割して暗号化する。
- GCM: ブロック暗号の動作モードの一つで、認証付き暗号 (AEAD) を提供する。データの機密性(暗号化)と完全性・認証(改ざん検知)を同時に保証する。
- AEAD (Authenticated Encryption with Associated Data): 暗号化と認証を同時に行う方式。これにより、データの改ざんや偽造を防ぎつつ、機密性も確保できる。GCMはAEADの代表的なモード。
-
Go言語の
crypto
パッケージ:- Go言語の標準ライブラリに含まれる暗号化関連のパッケージ群。
crypto/tls
: TLSプロトコルを実装し、クライアントおよびサーバーサイドのTLS通信を可能にする。crypto/x509
: X.509証明書の解析、生成、検証を行うための機能を提供する。
-
CL (Change List):
- Goプロジェクトでは、コード変更はGerritというコードレビューシステムを通じて管理される。各変更は「Change List (CL)」として識別され、一意の番号が割り当てられる。コミットメッセージに記載されているCL番号は、その変更がどのGerritレビューに対応するかを示す。
これらの知識があることで、このコミットがGo言語のセキュリティ機能にどのような影響を与え、なぜそれが重要であったかを深く理解できます。
技術的詳細
このコミットは、Go 1.2リリースノートの更新であり、以下の主要な技術的変更がGoの crypto
パッケージに導入されたことを示しています。
-
crypto/x509
: 任意の拡張機能の読み書きサポート (CL 12056043)- X.509証明書は、標準的なフィールドに加えて、拡張機能 (Extensions) を含むことができます。これらの拡張機能は、OID (Object Identifier) と値のペアで構成されます。
- これ以前のGoの
crypto/x509
パッケージでは、標準で定義されている特定の拡張機能(例:Key Usage
,Subject Alternative Name
)のみを構造体として直接扱うことができました。しかし、標準外のカスタム拡張機能や、将来的に追加される新しい標準拡張機能に対応するためには、任意のOIDを持つ拡張機能を汎用的に読み書きできるメカニズムが必要でした。 - この変更により、
crypto/x509
パッケージは、証明書内の未知の、またはカスタムの拡張機能を、そのOIDとDER (Distinguished Encoding Rules) エンコードされた値として、汎用的なデータ構造(例えば[]asn1.ObjectIdentifier
と[]byte
のペアのリスト)として扱うことができるようになりました。 - これにより、Goアプリケーションは、特定のアプリケーションや組織で利用されるカスタム拡張機能を含む証明書をパースしたり、そのような証明書を生成したりする柔軟性を獲得しました。これは、相互運用性や特定のPKI要件への対応において非常に重要です。
-
crypto/tls
: TLS 1.1, 1.2 および AES-GCM のサポート (CL 7872043, 10762044, 13249044)- TLS 1.1 および 1.2 のサポート:
- Goの
crypto/tls
パッケージは、TLSプロトコルのバージョン1.1および1.2をサポートするように拡張されました。 - TLS 1.1は、TLS 1.0のBEAST攻撃などの脆弱性に対処するために導入されました。
- TLS 1.2は、より強力なハッシュ関数(SHA-256など)と暗号スイート(AES-GCMなど)をサポートし、セキュリティを大幅に向上させました。これは、当時の最新かつ最も推奨されるTLSバージョンでした。
- このサポートにより、Goで書かれたクライアントおよびサーバーアプリケーションは、より新しい、より安全なTLSバージョンを使用して通信できるようになり、中間者攻撃やその他の暗号攻撃に対する耐性が向上しました。
- Goの
- AES-GCM 暗号スイートのサポート:
crypto/tls
パッケージは、AES-GCMモードを使用する暗号スイートをサポートするようになりました。- AES-GCMは、認証付き暗号 (AEAD) を提供するため、データの機密性だけでなく、完全性と認証も保証します。これにより、通信中にデータが改ざんされていないこと、および通信相手が正当であることを確認できます。
- TLS 1.2ではAES-GCMが推奨される暗号スイートの一つであり、そのサポートはGoのTLS実装のセキュリティとパフォーマンスを向上させる上で不可欠でした。AES-GCMは、特にハードウェアアクセラレーションが利用可能な場合、非常に高速に動作します。
- TLS 1.1 および 1.2 のサポート:
これらの変更は、Go言語が当時の最新のセキュリティ標準に準拠し、開発者がより安全で高性能なネットワークアプリケーションを構築するための基盤を提供したことを示しています。
コアとなるコードの変更箇所
このコミット自体は、doc/go1.2.txt
というドキュメントファイルのみを変更しています。実際の機能追加は、このドキュメントで言及されている各CL (Change List) に対応するコミットで行われています。
変更されたファイル: /home/orange/Project/comemo/doc/go1.2.txt
--- a/doc/go1.2.txt
+++ b/doc/go1.2.txt
@@ -40,7 +40,8 @@ crypto/md5: Sum function to simplify hashing (CL10624044).
crypto/sha1: Sum function to simplify hashing (CL 10571043).
crypto/sha256: Sum256 and Sum224 functions to simplify hashing (CL 10629043).
crypto/sha512: Sum512 and Sum384 functions to simplify hashing (CL 10630043).
-crypto/tls: add support for TLS 1.1. (CL 7872043).
+crypto/x509: add support for reading and writing arbitrary extensions (CL 12056043).
+crypto/tls: add support for TLS 1.1, 1.2 and AES-GCM. (CL 7872043, 10762044 and 13249044).
database/sql: add SetMaxOpenConns method on DB (CL 10726044).
encoding: new package defining generic encoding interfaces (CL 12541051).
encoding/csv: always allow trailing commas (CL 12294043).
具体的には、以下の変更が行われています。
-crypto/tls: add support for TLS 1.1. (CL 7872043).
- この行が削除されました。これは、TLS 1.1のサポートに関する記述が、より包括的な新しい記述に置き換えられるためです。
+crypto/x509: add support for reading and writing arbitrary extensions (CL 12056043).
crypto/x509
パッケージが任意の拡張機能の読み書きをサポートするようになったことを示す新しい行が追加されました。
+crypto/tls: add support for TLS 1.1, 1.2 and AES-GCM. (CL 7872043, 10762044 and 13249044).
crypto/tls
パッケージがTLS 1.1、TLS 1.2、およびAES-GCMをサポートするようになったことを示す新しい行が追加されました。複数のCL番号が記載されており、これらの機能が複数の独立した変更によって導入されたことを示唆しています。
コアとなるコードの解説
このコミット自体はドキュメントの変更であるため、直接的な「コアとなるコード」の変更はありません。しかし、このドキュメントが言及している機能追加は、Go言語の crypto/x509
および crypto/tls
パッケージの内部実装に大きな変更をもたらしました。
crypto/x509
における任意の拡張機能の読み書きサポート (CL 12056043):
この変更は、x509.Certificate
構造体や関連するパース/エンコード関数に影響を与えたと考えられます。具体的には、x509.Certificate
構造体に、標準で認識されない拡張機能を格納するためのフィールド(例: Extensions []pkix.Extension
のようなスライス)が追加された可能性があります。pkix.Extension
は、OIDと値(DERエンコードされたバイトスライス)を含む構造体です。
これにより、x509.ParseCertificate
関数は、証明書をパースする際に、既知の拡張機能だけでなく、未知の拡張機能もこの新しいフィールドに格納するようになります。同様に、x509.CreateCertificate
関数は、このフィールドに格納された任意の拡張機能を含めて証明書を生成できるようになります。
crypto/tls
における TLS 1.1, 1.2 および AES-GCM のサポート (CL 7872043, 10762044, 13249044):
これらの変更は、crypto/tls
パッケージのハンドシェイクプロトコル、暗号スイートのネゴシエーションロジック、および暗号化/復号化の実装に深く関わっています。
- TLS バージョンネゴシエーション:
tls.Config
構造体にMinVersion
やMaxVersion
のようなフィールドが追加され、アプリケーションが使用するTLSプロトコルの最小/最大バージョンを指定できるようになります。ハンドシェイク時には、クライアントとサーバーが互いにサポートする最も高い共通バージョンを合意するロジックが実装されます。 - 暗号スイートの追加:
tls.CipherSuite
型に新しいAES-GCMベースの暗号スイート定数(例:TLS_RSA_WITH_AES_128_GCM_SHA256
)が追加され、tls.Config
のCipherSuites
フィールドでこれらの新しいスイートを指定できるようになります。 - AES-GCM の実装:
crypto/cipher
パッケージのcipher.AEAD
インターフェースを利用して、AES-GCMの暗号化および復号化ロジックが実装されます。TLSハンドシェイクでAES-GCMが選択された場合、この実装が実際のデータ暗号化に使用されます。これには、Nonce(Number used once)の生成と管理、認証タグの計算と検証などが含まれます。 - レコードプロトコルの変更: TLS 1.1および1.2では、レコードプロトコルにも変更点があるため、それに対応する処理が
crypto/tls
の内部で実装されます。
これらの変更は、Go言語のネットワークセキュリティ機能の基盤を強化し、より現代的で安全な通信を可能にするための重要なステップでした。
関連リンク
- Go 1.2 Release Notes: このコミットが更新しているドキュメントの最終版。Go 1.2の全変更点を確認できます。
- CL 12056043 (crypto/x509: add support for reading and writing arbitrary extensions):
- CL 7872043 (crypto/tls: add support for TLS 1.1):
- CL 10762044 (crypto/tls: add support for TLS 1.2):
- CL 13249044 (crypto/tls: add AES-GCM cipher suites):
参考にした情報源リンク
- TLS (Transport Layer Security):
- X.509:
- AES-GCM:
- Authenticated Encryption with Associated Data (AEAD):
- Go言語の公式ドキュメント:
- Gerrit Code Review:
- BEAST Attack:
- SHA-256:
- DER Encoding:
- OID (Object Identifier):
- PKI (Public Key Infrastructure):