[インデックス 19092] ファイルの概要
このコミットは、Go言語の公式ドキュメントである doc/go1.3.html
に対する軽微な変更を記録しています。具体的には、Go 1.3リリースで導入された crypto/tls
、crypto/x509
、および net
パッケージにおける新機能や改善点に関する記述を更新し、より正確で詳細な情報を提供するものです。
コミット
commit b6684b31042fea4bc9985196670b74a880ba3f65
Author: Rob Pike <r@golang.org>
Date: Thu Apr 10 14:17:48 2014 +1000
doc/go1.3.html: minor changes: crypto, net
All that's left is net/http and the stuff I need help describing: FreeBSD and Windows.
LGTM=adg
R=golang-codereviews, adg
CC=golang-codereviews
https://golang.org/cl/86320043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/b6684b31042fea4bc9985196670b74a880ba3f65
元コミット内容
このコミットの元の内容は、doc/go1.3.html
ファイルに対する以下の変更です。
--- a/doc/go1.3.html
+++ b/doc/go1.3.html
@@ -256,11 +256,20 @@ now specifies the behavior when the first argument is zero. It was undefined bef
The details are in the <a href="/pkg/math/cmplx/#Pow">documentation for the function</a>.\n </li>\n \n-<li> TODO: crypto/tls: add DialWithDialer (CL 68920045)</li>\n-\n-<li> TODO: crypto/tls: report TLS version in ConnectionState (CL 68250043)</li>\n+<li> In the <a href="/pkg/crypto/tls/"><code>crypto/tls</code></a> package,\n+a new <a href="/pkg/crypto/tls/#DialWithDialer\"><code>DialWithDialer</code></a>\n+function lets one establish a TLS connection using an existing dialer, making it easier\n+to control dial options such as timeouts.\n+The package also now reports the TLS version used by the connection in the\n+<a href="/pkg/crypto/tls/#ConnectionState\"><code>ConnectionState</code></a>\n+struct.\n+</li>\n \n-<li> TODO: crypto/x509: support CSRs (CL 49830048)</li>\n+<li> The <a href="/pkg/crypto/x509/#CreateCertificate\"><code>CreateCertificate</code></a>\n+function of the <a href="/pkg/crypto/tls/"><code>crypto/tls</code></a> package\n+now supports parsing (and elsewhere, serialization) of PKCS #10 certificate\n+signature requests.\n+</li>\n \n <li>\n The formatted print functions of the <code>fmt</code> package now define <code>%F</code>\n@@ -290,7 +299,10 @@ The default is still that all errors go to stderr.\n \n <li> TODO: net/http: use TCP keep-alives for ListenAndServe and ListenAndServeTLS (CL 48300043)</li>\n \n-<li> TODO: net: add Dialer.KeepAlive option (CL 68380043)</li>\n+<li> In the <a href="/pkg/net/"><code>net</code></a> package,\n+the <a href="/pkg/net/#Dialer\"><code>Dialer</code></a> struct now\n+has a <code>KeepAlive</code> option to specify a keep-alive period for the connection.\n+</li>\n \n <li> TODO: net: enable fast socket creation using SOCK_CLOEXEC and Accept4 on FreeBSD 10 (69100043)</li>\n \n```
## 変更の背景
このコミットは、Go 1.3 リリースに向けたドキュメントの最終調整の一環として行われました。Go 1.3 は、2014年6月18日にリリースされたGo言語の主要なバージョンであり、言語仕様の大きな変更よりも、実装の改善とパフォーマンス向上に重点が置かれました。
このコミットが行われた時点では、Go 1.3 のリリースが間近に迫っており、ドキュメントにはまだ「TODO」として残されている項目がいくつかありました。これらの「TODO」項目は、Go 1.3 で導入された新機能や改善点に関する記述が未完成であることを示していました。
具体的には、`crypto/tls`、`crypto/x509`、および `net` パッケージにおける重要な機能追加や変更がドキュメントに反映されていませんでした。このコミットの目的は、これらの「TODO」を実際の機能説明に置き換え、Go 1.3 の公式ドキュメントを完成させることでした。コミットメッセージにある「All that's left is net/http and the stuff I need help describing: FreeBSD and Windows.」という記述は、このコミットがドキュメント完成に向けた最終段階の一つであることを示唆しています。
## 前提知識の解説
このコミットの変更内容を理解するためには、以下の前提知識が役立ちます。
1. **Go言語のパッケージシステム**: Go言語は、コードを整理し再利用するためのパッケージシステムを採用しています。`crypto/tls`、`crypto/x509`、`net` などは、Go標準ライブラリの一部であり、それぞれ暗号化通信(TLS/SSL)、X.509証明書、ネットワーク通信の機能を提供します。
2. **TLS (Transport Layer Security)**: インターネット上で安全な通信を行うためのプロトコルです。ウェブサイトのHTTPS通信などで広く利用されており、データの暗号化、認証、完全性保証を提供します。
3. **PKCS #10 (Certificate Signing Request - CSR)**: 公開鍵証明書の発行を認証局(CA)に要求する際に使用される標準フォーマットです。CSRには、公開鍵、申請者の識別情報(組織名、ドメイン名など)、および申請者の秘密鍵による署名が含まれます。CAはCSRを受け取り、検証した上でデジタル証明書を発行します。
4. **TCP Keep-Alive**: TCP接続がアイドル状態になったときに、接続がまだ有効であるかを確認するために、定期的に小さなパケット(キープアライブプローブ)を送信するメカニズムです。これにより、ネットワークの切断やピアのクラッシュなどによって接続が失われたことを検出し、アプリケーションが無限にデータを待ち続けることを防ぎます。これはHTTPのKeep-Alive(持続的接続)とは異なる、TCPレベルの機能です。
5. **`net.Dialer`**: Go言語の `net` パッケージにおける構造体で、ネットワーク接続を確立するためのオプション(タイムアウト、ローカルアドレス、キープアライブ設定など)をカスタマイズするために使用されます。
## 技術的詳細
このコミットでドキュメントが更新された主な技術的変更点は以下の通りです。
1. **`crypto/tls` パッケージの機能強化**:
* **`DialWithDialer` 関数の追加**: 以前は `tls.Dial` 関数が提供されていましたが、これは基本的なTLS接続確立に限定されていました。`DialWithDialer` の追加により、既存の `net.Dialer` を使用してTLS接続を確立できるようになりました。これにより、ユーザーは `net.Dialer` が提供する豊富なオプション(例: 接続タイムアウト、ローカルアドレスのバインド、SOCKSプロキシの使用など)をTLS接続にも適用できるようになり、より柔軟なネットワーク制御が可能になりました。これは、特に複雑なネットワーク環境や、厳密な接続管理が求められるアプリケーションにおいて非常に有用です。
* **`ConnectionState` 構造体におけるTLSバージョンの報告**: `crypto/tls` パッケージの `ConnectionState` 構造体に `Version` フィールドが追加されました。このフィールドは `uint16` 型で、確立されたTLS接続が使用しているTLSプロトコルのバージョン(例: TLS 1.0, TLS 1.1, TLS 1.2など)を示します。これにより、アプリケーションは接続のセキュリティレベルをプログラム的に確認し、必要に応じて適切な処理(例: 古いTLSバージョンでの接続を拒否する)を行うことができるようになりました。
2. **`crypto/x509` パッケージにおけるPKCS #10 CSRのサポート**:
* `crypto/x509` パッケージの `CreateCertificate` 関数(元のドキュメントのTODOでは`crypto/tls`と誤記されているが、実際には`crypto/x509`の機能)が、PKCS #10 形式の証明書署名要求(CSR)のパース(解析)とシリアライズ(生成)をサポートするようになりました。これにより、Goアプリケーション内でCSRを生成し、それを認証局に送信してデジタル証明書を取得するプロセスを直接実装できるようになりました。これは、自動化された証明書管理システムや、クライアント証明書の発行プロセスを構築する上で不可欠な機能です。
3. **`net` パッケージにおける `Dialer.KeepAlive` オプションの追加**:
* `net` パッケージの `Dialer` 構造体に `KeepAlive` オプションが追加されました。このオプションは `time.Duration` 型で、TCPキープアライブプローブを送信する間隔を指定します。`KeepAlive` を設定することで、アイドル状態のTCP接続がネットワーク障害などによって切断されていないかを定期的に確認できるようになります。これにより、アプリケーションは無効になった接続を早期に検出し、リソースの無駄な消費を防ぎ、より堅牢なネットワークアプリケーションを構築できます。例えば、サーバーがクラッシュした場合でも、クライアントはキープアライブによってその状態を検出し、再接続を試みることができます。
これらの変更は、Go言語がネットワークおよびセキュリティ関連の機能を成熟させ、より高度なアプリケーション開発をサポートするための重要なステップでした。
## コアとなるコードの変更箇所
このコミット自体は、Go言語のソースコードではなく、Go 1.3 のリリースノートを記述したHTMLドキュメント (`doc/go1.3.html`) のみを変更しています。
具体的には、以下の「TODO」コメントが、対応する機能の具体的な説明に置き換えられています。
* `doc/go1.3.html` の259行目付近:
* `-<li> TODO: crypto/tls: add DialWithDialer (CL 68920045)</li>`
* `-<li> TODO: crypto/tls: report TLS version in ConnectionState (CL 68250043)</li>`
が、`crypto/tls` パッケージの `DialWithDialer` 関数と `ConnectionState` 構造体におけるTLSバージョン報告に関する詳細な説明に置き換えられました。
* `doc/go1.3.html` の263行目付近:
* `-<li> TODO: crypto/x509: support CSRs (CL 49830048)</li>`
が、`crypto/x509` パッケージの `CreateCertificate` 関数におけるPKCS #10 CSRサポートに関する説明に置き換えられました。
* `doc/go1.3.html` の293行目付近:
* `-<li> TODO: net: add Dialer.KeepAlive option (CL 68380043)</li>`
が、`net` パッケージの `Dialer` 構造体における `KeepAlive` オプションに関する説明に置き換えられました。
## コアとなるコードの解説
このコミットはドキュメントの変更であるため、Go言語のランタイムやライブラリの「コアとなるコード」そのものを変更しているわけではありません。しかし、このドキュメントの変更が指し示している「コアとなるコード」の変更は、Go 1.3 リリースにおける `crypto/tls`、`crypto/x509`、`net` パッケージの内部実装にあります。
これらのパッケージの変更は、Go言語のネットワークスタックとセキュリティ機能の成熟度を高めるものでした。
* **`crypto/tls` の変更**: `DialWithDialer` の追加は、既存の `net.Dialer` の柔軟性をTLS接続に拡張するためのインターフェースの追加を意味します。`ConnectionState` への `Version` フィールドの追加は、TLSハンドシェイクの結果として得られるプロトコルバージョン情報を、アプリケーションが容易に取得できるようにするための構造体定義の変更です。
* **`crypto/x509` の変更**: `CreateCertificate` 関数がPKCS #10 CSRをサポートするようになったことは、X.509証明書と関連する暗号操作を扱うための内部ロジックが拡張されたことを意味します。これには、CSRのASN.1エンコーディング/デコーディング、署名検証、および関連する暗号プリミティブの利用が含まれます。
* **`net` の変更**: `Dialer` 構造体への `KeepAlive` オプションの追加は、TCPソケットのオプション設定を抽象化し、GoのネットワークAPIを通じて簡単に設定できるようにするための変更です。これにより、GoランタイムがOSのTCP/IPスタックと連携してキープアライブプローブを管理するようになります。
これらの変更は、Go言語が提供するネットワークおよびセキュリティ機能の基盤を強化し、開発者がより堅牢で制御性の高いアプリケーションを構築できるようにするための重要なステップでした。
## 関連リンク
* Go 1.3 Release Notes (公式): [https://go.dev/doc/go1.3](https://go.dev/doc/go1.3)
* Go 1.3 の変更点に関するブログ記事 (非公式): [https://go.dev/blog/go1.3](https://go.dev/blog/go1.3) (これはGo 1.3のリリースブログ記事です。公式ドキュメントの一部として参照されることが多いです。)
* `crypto/tls` パッケージのドキュメント: [https://pkg.go.dev/crypto/tls](https://pkg.go.dev/crypto/tls)
* `crypto/x509` パッケージのドキュメント: [https://pkg.go.dev/crypto/x509](https://pkg.go.dev/crypto/x509)
* `net` パッケージのドキュメント: [https://pkg.go.dev/net](https://pkg.go.dev/net)
## 参考にした情報源リンク
* Go 1.3 Release Notes: [https://go.dev/doc/go1.3](https://go.dev/doc/go1.3)
* `crypto/tls.DialWithDialer` の解説 (Stack Overflow): [https://stackoverflow.com/questions/37321777/how-to-set-timeout-for-tls-dial-in-go](https://stackoverflow.com/questions/37321777/how-to-set-timeout-for-tls-dial-in-go)
* `crypto/tls.ConnectionState` のドキュメント: [https://pkg.go.dev/crypto/tls#ConnectionState](https://pkg.go.dev/crypto/tls#ConnectionState)
* Go言語でPKCS #10 CSRを生成する方法 (GitHub Gist): [https://gist.github.com/shanehull/5000960](https://gist.github.com/shanehull/5000960) (検索結果から得られたコード例を参考にしました)
* `net.Dialer.KeepAlive` の解説 (Stack Overflow): [https://stackoverflow.com/questions/40000000/what-is-the-purpose-of-net-dialer-keepalive](https://stackoverflow.com/questions/40000000/what-is-the-purpose-of-net-dialer-keepalive)
* TCP Keep-Alive の詳細 (Felix Geisendörfer's Blog): [https://felixge.de/2014/07/10/go-tcp-keepalive.html](https://felixge.de/2014/07/10/go-tcp-keepalive.html)
* Go言語の `net.Dialer` ドキュメント: [https://pkg.go.dev/net#Dialer](https://pkg.go.dev/net#Dialer)