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

[インデックス 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を使用する技術的な理由と、その回避策を詳細に説明しています。

  1. go get がHTTPSを使用する理由:

    • ファイアウォール互換性: 多くの企業や組織では、セキュリティポリシーにより、標準的なWebトラフィックポート(HTTPの80番、HTTPSの443番)以外のポートからの外部への接続が制限されています。Gitプロトコル(9418番)やSSH(22番)はブロックされることが多いため、HTTPSを使用することで、より広範なネットワーク環境で go get が機能するようにしています。
    • セキュリティ: HTTPSはSSL/TLSによる暗号化を提供し、通信の盗聴や改ざんを防ぎます。特に、git コマンドはHTTPS使用時にデフォルトで証明書検証を強制するため、中間者攻撃に対する強力な保護を提供します。go get がHTTPSを優先するのは、このセキュリティ上の利点も大きな理由です。
  2. 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? を定義しています。

このセクションは以下の主要な部分で構成されています。

  1. 問題提起と理由の説明: 最初の <p> タグ内で、企業環境でポート80(HTTP)と443(HTTPS)以外のトラフィックがブロックされることが多いという背景を説明しています。そして、git がHTTPS使用時にデフォルトで証明書検証を行うことで、中間者攻撃などから保護されるため、go get が安全のためにHTTPSを使用していることを明確に述べています。

  2. 回避策の導入: 次の <p> タグで、既存のSSHキーを使用して変更をプッシュしたいGitユーザー向けの回避策があることを示唆しています。

  3. 具体的な回避策のリスト: <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開発者が直面する可能性のある一般的な問題を解決し、よりスムーズな開発ワークフローを促進します。

関連リンク

参考にした情報源リンク

  • 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を使用する技術的な理由と、その回避策を詳細に説明しています。

  1. go get がHTTPSを使用する理由:

    • ファイアウォール互換性: 多くの企業や組織では、セキュリティポリシーにより、標準的なWebトラフィックポート(HTTPの80番、HTTPSの443番)以外のポートからの外部への接続が制限されています。Gitプロトコル(9418番)やSSH(22番)はブロックされることが多いため、HTTPSを使用することで、より広範なネットワーク環境で go get が機能するようにしています。
    • セキュリティ: HTTPSはSSL/TLSによる暗号化を提供し、通信の盗聴や改ざんを防ぎます。特に、git コマンドはHTTPS使用時にデフォルトで証明書検証を強制するため、中間者攻撃に対する強力な保護を提供します。go get がHTTPSを優先するのは、このセキュリティ上の利点も大きな理由です。
  2. 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? を定義しています。

このセクションは以下の主要な部分で構成されています。

  1. 問題提起と理由の説明: 最初の <p> タグ内で、企業環境でポート80(HTTP)と443(HTTPS)以外のトラフィックがブロックされることが多いという背景を説明しています。そして、git がHTTPS使用時にデフォルトで証明書検証を行うことで、中間者攻撃などから保護されるため、go get が安全のためにHTTPSを使用していることを明確に述べています。

  2. 回避策の導入: 次の <p> タグで、既存のSSHキーを使用して変更をプッシュしたいGitユーザー向けの回避策があることを示唆しています。

  3. 具体的な回避策のリスト: <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開発者が直面する可能性のある一般的な問題を解決し、よりスムーズな開発ワークフローを促進します。

関連リンク

参考にした情報源リンク

  • GitHub上でのコミットページ: https://github.com/golang/go/commit/99021b767f991bba547c282f173f63cf997b58c3
  • Git公式ドキュメント: Gitのプロトコルや設定に関する一般的な情報源として参照しました。
  • Go言語公式ドキュメント: go get コマンドに関する一般的な情報源として参照しました。
  • Stack Overflow / 開発者フォーラム: go get とGitプロトコルに関する一般的な問題解決の議論を参考にしました。
  • Wikipedia: HTTPS, SSH, MITM攻撃などの一般的な概念について参照しました。