[インデックス 15801] ファイルの概要
このコミットは、Go言語の公式FAQドキュメントである doc/go_faq.html
に新しい項目を追加するものです。具体的には、go get
コマンドがリポジトリのクローンにHTTPSプロトコルを使用する理由と、既存のSSHキーを使用して変更をプッシュしたい場合の回避策について説明しています。これは、Issue #3418 を解決するために行われました。
コミット
- コミットハッシュ:
99021b767f991bba547c282f173f63cf997b58c3
- 作者: Herbert Georg Fischer (
herbert.fischer@gmail.com
) - コミット日時: 2013年3月15日 金曜日 13:43:10 -0700
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/99021b767f991bba547c282f173f63cf997b58c3
元コミット内容
doc: explain why cmd/go uses https for repositories and how to work around it
Fixes #3418.
R=golang-dev, r
CC=adg, golang-dev
https://golang.org/cl/7712045
変更の背景
この変更の背景には、Go言語のパッケージ管理ツールである go get
コマンドの挙動に関するユーザーからの疑問や問題提起がありました。特に、企業ネットワーク環境などにおいて、ファイアウォールが特定のポート(例: GitプロトコルのTCPポート9418やSSHのTCPポート22)からの外部へのトラフィックをブロックしている場合、go get
がリポジトリをクローンできないという問題が発生していました。
go get
は、デフォルトでリポジトリのクローンにHTTPSプロトコルを使用します。これは、セキュリティ上の理由(中間者攻撃、盗聴、改ざんからの保護)と、一般的な企業ネットワークでHTTP(ポート80)とHTTPS(ポート443)のトラフィックのみが許可されていることが多いという実用的な理由に基づいています。しかし、Gitユーザーの中には、既存のSSHキーを使用してリポジトリを管理し、変更をプッシュしたいと考える人もいます。go get
がHTTPSを使用するため、SSHでのプッシュが直接的に行えないという混乱が生じていました。
このコミットは、これらの疑問や問題を解消するため、GoのFAQに公式な説明と回避策を追加することで、ユーザーエクスペリエンスを向上させることを目的としています。具体的には、Issue #3418 で報告された問題に対応しています。
前提知識の解説
このコミットの理解には、以下の技術的な前提知識が役立ちます。
go get
コマンド: Go言語の公式ツールチェーンの一部であり、リモートリポジトリからGoパッケージとその依存関係をダウンロードし、インストールするために使用されます。通常、$GOPATH/src
以下にリポジトリをクローンします。- Gitプロトコル: Gitリポジトリと通信するためのプロトコルにはいくつか種類があります。
- HTTPS (HTTP Secure): TCPポート443を使用します。SSL/TLSによって暗号化され、セキュアな通信が可能です。企業ネットワークでは一般的に許可されています。
- SSH (Secure Shell): TCPポート22を使用します。公開鍵認証によるセキュアな通信が可能で、認証情報なしでクローンしたり、認証情報を使ってプッシュしたりできます。
- Gitプロトコル: TCPポート9418を使用します。認証なしでリポジトリを公開する際に使用されますが、暗号化はされません。
- 証明書検証 (Certificate Validation): HTTPS通信において、サーバーの身元が本物であることを確認するプロセスです。これにより、中間者攻撃(Man-in-the-Middle, MITM)を防ぎます。
git
コマンドはデフォルトでHTTPS接続時に証明書検証を行います。 - 中間者攻撃 (Man-in-the-Middle, MITM) 攻撃: 攻撃者が通信を行う二者間に入り込み、両者の通信を盗聴、改ざんする攻撃手法です。HTTPSの証明書検証は、この種の攻撃に対する防御策の一つです。
~/.gitconfig
: Gitの設定ファイルで、ユーザーごとのGitの挙動をカスタマイズするために使用されます。このファイルに設定を追加することで、特定のURLを別のURLに書き換えたり、プロトコルを強制したりすることができます。GOPATH
: Go言語のワークスペースのルートディレクトリを指す環境変数です。go get
コマンドは、このディレクトリのsrc
サブディレクトリにリポジトリをクローンします。git clone
: Gitリポジトリをローカルに複製するコマンドです。git push
: ローカルリポジトリの変更をリモートリポジトリに送信するコマンドです。
技術的詳細
このコミットで追加されたFAQエントリは、go get
がHTTPSを使用する技術的な理由と、その回避策を詳細に説明しています。
-
go get
がHTTPSを使用する理由:- ファイアウォール互換性: 多くの企業や組織では、セキュリティポリシーにより、標準的なWebトラフィックポート(HTTPの80番、HTTPSの443番)以外のポートからの外部への接続が制限されています。Gitプロトコル(9418番)やSSH(22番)はブロックされることが多いため、HTTPSを使用することで、より広範なネットワーク環境で
go get
が機能するようにしています。 - セキュリティ: HTTPSはSSL/TLSによる暗号化を提供し、通信の盗聴や改ざんを防ぎます。特に、
git
コマンドはHTTPS使用時にデフォルトで証明書検証を強制するため、中間者攻撃に対する強力な保護を提供します。go get
がHTTPSを優先するのは、このセキュリティ上の利点も大きな理由です。
- ファイアウォール互換性: 多くの企業や組織では、セキュリティポリシーにより、標準的なWebトラフィックポート(HTTPの80番、HTTPSの443番)以外のポートからの外部への接続が制限されています。Gitプロトコル(9418番)やSSH(22番)はブロックされることが多いため、HTTPSを使用することで、より広範なネットワーク環境で
-
SSHでのプッシュを希望する場合の回避策:
go get
がHTTPSでクローンしても、GitユーザーがSSHを使って変更をプッシュしたいというニーズに対応するため、以下の2つの回避策が提示されています。-
手動でのリポジトリクローン:
go get
が自動的にクローンする代わりに、ユーザーが$GOPATH/src/github.com/username
のような期待されるパッケージディレクトリに移動し、手動でgit clone git@github.com:username/package.git
のようにSSHプロトコルを使ってリポジトリをクローンする方法です。これにより、ローカルリポジトリはSSHプロトコルをリモートとして認識するため、その後のgit push
はSSH経由で行われます。 -
~/.gitconfig
を使用したpushInsteadOf
の設定: これはより洗練された方法で、GitのURL書き換え機能を利用します。~/.gitconfig
ファイルに以下の設定を追加します。[url "git@github.com:"] pushInsteadOf = https://github.com/
この設定は、Gitに対して「
https://github.com/
で始まるURLへのプッシュ操作が行われようとした場合、代わりにgit@github.com:
で始まるURLを使用せよ」と指示します。これにより、go get
がHTTPSでクローンしたリポジトリであっても、git push
コマンドは自動的にSSHプロトコルに切り替えてプッシュを実行するようになります。これは、開発者がHTTPSでクローンされたリポジトリに対して、SSH認証情報を使ってシームレスにプッシュできるようにするための非常に便利な機能です。
-
これらの技術的詳細は、Go言語のツールがどのようにネットワーク環境の制約とセキュリティ要件のバランスを取っているかを示しており、ユーザーが特定のニーズに合わせて挙動を調整できる柔軟性を提供しています。
コアとなるコードの変更箇所
このコミットによる変更は、doc/go_faq.html
ファイルに集中しています。具体的には、ファイルの末尾近く、既存の <h2 id="Pointers">Pointers and Allocation</h2>
の直前に、新しいFAQセクションが追加されています。
--- a/doc/go_faq.html
+++ b/doc/go_faq.html
@@ -949,6 +949,38 @@ combined with the Go project\'s mostly linear, non-branching use of
version control, a switch to git doesn\'t seem worthwhile.\n </p>\n \n+<h3 id=\"git_https\">\n+Why does \"go get\" use HTTPS when cloning a repository?</h3>\n+\n+<p>\n+Companies often permit outgoing traffic only on the standard TCP ports 80 (HTTP)\n+and 443 (HTTPS), blocking outgoing traffic on other ports, including TCP port 9418 \n+(git) and TCP port 22 (SSH).\n+When using HTTPS instead of HTTP, <code>git</code> enforces certificate validation by\n+default, providing protection against man-in-the-middle, eavesdropping and tampering attacks.\n+The <code>go get</code> command therefore uses HTTPS for safety.\n+</p>\n+\n+<p>\n+If you use <code>git</code> and prefer to push changes through SSH using your existing key \n+it\'s easy to work around this. For GitHub, try one of these solutions:\n+</p>\n+<ul>\n+<li>Manually clone the repository in the expected package directory:\n+<pre>\n+$ cd $GOPATH/src/github.com/username\n+$ git clone git@github.com:username/package.git\n+</pre>\n+</li>\n+<li>Force <code>git push</code> to use the <code>SSH</code> protocol by appending\n+these two lines to <code>~/.gitconfig</code>:\n+<pre>\n+[url \"git@github.com:\"]\n+\tpushInsteadOf = https://github.com/\n+</pre>\n+</li>\n+</ul>\n+\n <h2 id=\"Pointers\">Pointers and Allocation</h2>
この差分は、32行の追加を示しており、既存のHTMLドキュメントに新しいコンテンツが挿入されたことを意味します。
コアとなるコードの解説
追加されたHTMLコードは、GoのFAQページに新しいセクション Why does "go get" use HTTPS when cloning a repository?
を定義しています。
このセクションは以下の主要な部分で構成されています。
-
問題提起と理由の説明: 最初の
<p>
タグ内で、企業環境でポート80(HTTP)と443(HTTPS)以外のトラフィックがブロックされることが多いという背景を説明しています。そして、git
がHTTPS使用時にデフォルトで証明書検証を行うことで、中間者攻撃などから保護されるため、go get
が安全のためにHTTPSを使用していることを明確に述べています。 -
回避策の導入: 次の
<p>
タグで、既存のSSHキーを使用して変更をプッシュしたいGitユーザー向けの回避策があることを示唆しています。 -
具体的な回避策のリスト:
<ul>
リスト内で、2つの具体的な回避策が提供されています。- 手動クローン:
cd $GOPATH/src/github.com/username
に移動し、git clone git@github.com:username/package.git
を実行する手順がpre
タグで示されています。これは、go get
の自動クローンに頼らず、SSHプロトコルを明示的に使用してリポジトリをセットアップする方法です。 ~/.gitconfig
の設定:~/.gitconfig
に[url "git@github.com:"]
とpushInsteadOf = https://github.com/
を追加することで、HTTPSでクローンされたリポジトリに対してもgit push
がSSHプロトコルを使用するように強制できることが説明されています。これは、GitのURL書き換え機能を利用した高度な設定です。
- 手動クローン:
この追加されたドキュメントは、ユーザーが go get
の挙動を理解し、自身の開発環境やネットワーク環境に合わせてGitの操作を調整するための重要な情報を提供しています。これにより、Go開発者が直面する可能性のある一般的な問題を解決し、よりスムーズな開発ワークフローを促進します。
関連リンク
- Go Issue #3418: https://github.com/golang/go/issues/3418
- Go CL 7712045: https://golang.org/cl/7712045
参考にした情報源リンク
- GitHub上でのコミットページ: https://github.com/golang/go/commit/99021b767f991bba547c282f173f63cf997b58c3
- Git公式ドキュメント: Gitのプロトコルや設定に関する一般的な情報源として参照しました。
- Go言語公式ドキュメント:
go get
コマンドに関する一般的な情報源として参照しました。 - Stack Overflow / 開発者フォーラム:
go get
とGitプロトコルに関する一般的な問題解決の議論を参考にしました。 - Wikipedia: HTTPS, SSH, MITM攻撃などの一般的な概念について参照しました。```markdown
[インデックス 15801] ファイルの概要
このコミットは、Go言語の公式FAQドキュメントである doc/go_faq.html
に新しい項目を追加するものです。具体的には、go get
コマンドがリポジトリのクローンにHTTPSプロトコルを使用する理由と、既存のSSHキーを使用して変更をプッシュしたい場合の回避策について説明しています。これは、Issue #3418 を解決するために行われました。
コミット
- コミットハッシュ:
99021b767f991bba547c282f173f63cf997b58c3
- 作者: Herbert Georg Fischer (
herbert.fischer@gmail.com
) - コミット日時: 2013年3月15日 金曜日 13:43:10 -0700
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/99021b767f991bba547c282f173f63cf997b58c3
元コミット内容
doc: explain why cmd/go uses https for repositories and how to work around it
Fixes #3418.
R=golang-dev, r
CC=adg, golang-dev
https://golang.org/cl/7712045
変更の背景
この変更の背景には、Go言語のパッケージ管理ツールである go get
コマンドの挙動に関するユーザーからの疑問や問題提起がありました。特に、企業ネットワーク環境などにおいて、ファイアウォールが特定のポート(例: GitプロトコルのTCPポート9418やSSHのTCPポート22)からの外部へのトラフィックをブロックしている場合、go get
がリポジトリをクローンできないという問題が発生していました。
go get
は、デフォルトでリポジトリのクローンにHTTPSプロトコルを使用します。これは、セキュリティ上の理由(中間者攻撃、盗聴、改ざんからの保護)と、一般的な企業ネットワークでHTTP(ポート80)とHTTPS(ポート443)のトラフィックのみが許可されていることが多いという実用的な理由に基づいています。しかし、Gitユーザーの中には、既存のSSHキーを使用してリポジトリを管理し、変更をプッシュしたいと考える人もいます。go get
がHTTPSを使用するため、SSHでのプッシュが直接的に行えないという混乱が生じていました。
このコミットは、これらの疑問や問題を解消するため、GoのFAQに公式な説明と回避策を追加することで、ユーザーエクスペリエンスを向上させることを目的としています。具体的には、Issue #3418 で報告された問題に対応しています。
前提知識の解説
このコミットの理解には、以下の技術的な前提知識が役立ちます。
go get
コマンド: Go言語の公式ツールチェーンの一部であり、リモートリポジトリからGoパッケージとその依存関係をダウンロードし、インストールするために使用されます。通常、$GOPATH/src
以下にリポジトリをクローンします。- Gitプロトコル: Gitリポジトリと通信するためのプロトコルにはいくつか種類があります。
- HTTPS (HTTP Secure): TCPポート443を使用します。SSL/TLSによって暗号化され、セキュアな通信が可能です。企業ネットワークでは一般的に許可されています。
- SSH (Secure Shell): TCPポート22を使用します。公開鍵認証によるセキュアな通信が可能で、認証情報なしでクローンしたり、認証情報を使ってプッシュしたりできます。
- Gitプロトコル: TCPポート9418を使用します。認証なしでリポジリを公開する際に使用されますが、暗号化はされません。
- 証明書検証 (Certificate Validation): HTTPS通信において、サーバーの身元が本物であることを確認するプロセスです。これにより、中間者攻撃(Man-in-the-Middle, MITM)を防ぎます。
git
コマンドはデフォルトでHTTPS接続時に証明書検証を行います。 - 中間者攻撃 (Man-in-the-Middle, MITM) 攻撃: 攻撃者が通信を行う二者間に入り込み、両者の通信を盗聴、改ざんする攻撃手法です。HTTPSの証明書検証は、この種の攻撃に対する防御策の一つです。
~/.gitconfig
: Gitの設定ファイルで、ユーザーごとのGitの挙動をカスタマイズするために使用されます。このファイルに設定を追加することで、特定のURLを別のURLに書き換えたり、プロトコルを強制したりすることができます。GOPATH
: Go言語のワークスペースのルートディレクトリを指す環境変数です。go get
コマンドは、このディレクトリのsrc
サブディレクトリにリポジトリをクローンします。git clone
: Gitリポジトリをローカルに複製するコマンドです。git push
: ローカルリポジトリの変更をリモートリポジトリに送信するコマンドです。
技術的詳細
このコミットで追加されたFAQエントリは、go get
がHTTPSを使用する技術的な理由と、その回避策を詳細に説明しています。
-
go get
がHTTPSを使用する理由:- ファイアウォール互換性: 多くの企業や組織では、セキュリティポリシーにより、標準的なWebトラフィックポート(HTTPの80番、HTTPSの443番)以外のポートからの外部への接続が制限されています。Gitプロトコル(9418番)やSSH(22番)はブロックされることが多いため、HTTPSを使用することで、より広範なネットワーク環境で
go get
が機能するようにしています。 - セキュリティ: HTTPSはSSL/TLSによる暗号化を提供し、通信の盗聴や改ざんを防ぎます。特に、
git
コマンドはHTTPS使用時にデフォルトで証明書検証を強制するため、中間者攻撃に対する強力な保護を提供します。go get
がHTTPSを優先するのは、このセキュリティ上の利点も大きな理由です。
- ファイアウォール互換性: 多くの企業や組織では、セキュリティポリシーにより、標準的なWebトラフィックポート(HTTPの80番、HTTPSの443番)以外のポートからの外部への接続が制限されています。Gitプロトコル(9418番)やSSH(22番)はブロックされることが多いため、HTTPSを使用することで、より広範なネットワーク環境で
-
SSHでのプッシュを希望する場合の回避策:
go get
がHTTPSでクローンしても、GitユーザーがSSHを使って変更をプッシュしたいというニーズに対応するため、以下の2つの回避策が提示されています。-
手動でのリポジトリクローン:
go get
が自動的にクローンする代わりに、ユーザーが$GOPATH/src/github.com/username
のような期待されるパッケージディレクトリに移動し、手動でgit clone git@github.com:username/package.git
のようにSSHプロトコルを使ってリポジトリをクローンする方法です。これにより、ローカルリポジトリはSSHプロトコルをリモートとして認識するため、その後のgit push
はSSH経由で行われます。 -
~/.gitconfig
を使用したpushInsteadOf
の設定: これはより洗練された方法で、GitのURL書き換え機能を利用します。~/.gitconfig
ファイルに以下の設定を追加します。[url "git@github.com:"] pushInsteadOf = https://github.com/
この設定は、Gitに対して「
https://github.com/
で始まるURLへのプッシュ操作が行われようとした場合、代わりにgit@github.com:
で始まるURLを使用せよ」と指示します。これにより、go get
がHTTPSでクローンしたリポジトリであっても、git push
コマンドは自動的にSSHプロトコルに切り替えてプッシュを実行するようになります。これは、開発者がHTTPSでクローンされたリポジトリに対して、SSH認証情報を使ってシームレスにプッシュできるようにするための非常に便利な機能です。
-
これらの技術的詳細は、Go言語のツールがどのようにネットワーク環境の制約とセキュリティ要件のバランスを取っているかを示しており、ユーザーが特定のニーズに合わせて挙動を調整できる柔軟性を提供しています。
コアとなるコードの変更箇所
このコミットによる変更は、doc/go_faq.html
ファイルに集中しています。具体的には、ファイルの末尾近く、既存の <h2 id="Pointers">Pointers and Allocation</h2>
の直前に、新しいFAQセクションが追加されています。
--- a/doc/go_faq.html
+++ b/doc/go_faq.html
@@ -949,6 +949,38 @@ combined with the Go project\'s mostly linear, non-branching use of
version control, a switch to git doesn\'t seem worthwhile.\n </p>\n \n+<h3 id=\"git_https\">\n+Why does \"go get\" use HTTPS when cloning a repository?</h3>\n+\n+<p>\n+Companies often permit outgoing traffic only on the standard TCP ports 80 (HTTP)\n+and 443 (HTTPS), blocking outgoing traffic on other ports, including TCP port 9418 \n+(git) and TCP port 22 (SSH).\n+When using HTTPS instead of HTTP, <code>git</code> enforces certificate validation by\n+default, providing protection against man-in-the-middle, eavesdropping and tampering attacks.\n+The <code>go get</code> command therefore uses HTTPS for safety.\n+</p>\n+\n+<p>\n+If you use <code>git</code> and prefer to push changes through SSH using your existing key \n+it\'s easy to work around this. For GitHub, try one of these solutions:\n+</p>\n+<ul>\n+<li>Manually clone the repository in the expected package directory:\n+<pre>\n+$ cd $GOPATH/src/github.com/username\n+$ git clone git@github.com:username/package.git\n+</pre>\n+</li>\n+<li>Force <code>git push</code> to use the <code>SSH</code> protocol by appending\n+these two lines to <code>~/.gitconfig</code>:\n+<pre>\n+[url \"git@github.com:\"]\n+\tpushInsteadOf = https://github.com/\n+</pre>\n+</li>\n+</ul>\n+\n <h2 id=\"Pointers\">Pointers and Allocation</h2>
この差分は、32行の追加を示しており、既存のHTMLドキュメントに新しいコンテンツが挿入されたことを意味します。
コアとなるコードの解説
追加されたHTMLコードは、GoのFAQページに新しいセクション Why does "go get" use HTTPS when cloning a repository?
を定義しています。
このセクションは以下の主要な部分で構成されています。
-
問題提起と理由の説明: 最初の
<p>
タグ内で、企業環境でポート80(HTTP)と443(HTTPS)以外のトラフィックがブロックされることが多いという背景を説明しています。そして、git
がHTTPS使用時にデフォルトで証明書検証を行うことで、中間者攻撃などから保護されるため、go get
が安全のためにHTTPSを使用していることを明確に述べています。 -
回避策の導入: 次の
<p>
タグで、既存のSSHキーを使用して変更をプッシュしたいGitユーザー向けの回避策があることを示唆しています。 -
具体的な回避策のリスト:
<ul>
リスト内で、2つの具体的な回避策が提供されています。- 手動クローン:
cd $GOPATH/src/github.com/username
に移動し、git clone git@github.com:username/package.git
を実行する手順がpre
タグで示されています。これは、go get
の自動クローンに頼らず、SSHプロトコルを明示的に使用してリポジトリをセットアップする方法です。 ~/.gitconfig
の設定:~/.gitconfig
に[url "git@github.com:"]
とpushInsteadOf = https://github.com/
を追加することで、HTTPSでクローンされたリポジトリに対してもgit push
がSSHプロトコルを使用するように強制できることが説明されています。これは、GitのURL書き換え機能を利用した高度な設定です。
- 手動クローン:
この追加されたドキュメントは、ユーザーが go get
の挙動を理解し、自身の開発環境やネットワーク環境に合わせてGitの操作を調整するための重要な情報を提供しています。これにより、Go開発者が直面する可能性のある一般的な問題を解決し、よりスムーズな開発ワークフローを促進します。
関連リンク
- Go Issue #3418: https://github.com/golang/go/issues/3418
- Go CL 7712045: https://golang.org/cl/7712045
参考にした情報源リンク
- GitHub上でのコミットページ: https://github.com/golang/go/commit/99021b767f991bba547c282f173f63cf997b58c3
- Git公式ドキュメント: Gitのプロトコルや設定に関する一般的な情報源として参照しました。
- Go言語公式ドキュメント:
go get
コマンドに関する一般的な情報源として参照しました。 - Stack Overflow / 開発者フォーラム:
go get
とGitプロトコルに関する一般的な問題解決の議論を参考にしました。 - Wikipedia: HTTPS, SSH, MITM攻撃などの一般的な概念について参照しました。