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

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

このコミットは、Go言語の crypto/tls パッケージにおいて、OpenBSDオペレーティングシステムにおけるルート証明書の標準的な格納場所を追加するものです。これにより、OpenBSD環境でGoアプリケーションがTLS接続を確立する際に、システムにインストールされている信頼されたルート証明書を正しく利用できるようになります。

コミット

crypto/tls: add openbsd root certificate location

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

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

https://github.com/golang/go/commit/175e60a2ad47f477e5e3bfed83beaa9fe6a5ac85

元コミット内容

commit 175e60a2ad47f477e5e3bfed83beaa9fe6a5ac85
Author: Joel Sing <jsing@google.com>
Date:   Tue Nov 29 09:20:59 2011 -0500

    crypto/tls: add openbsd root certificate location
    
    R=golang-dev, bradfitz
    CC=golang-dev
    https://golang.org/cl/5437079
---
 src/pkg/crypto/tls/root_unix.go | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/pkg/crypto/tls/root_unix.go b/src/pkg/crypto/tls/root_unix.go
index 095beec104..1b9aeb03b5 100644
--- a/src/pkg/crypto/tls/root_unix.go
+++ b/src/pkg/crypto/tls/root_unix.go
@@ -14,6 +14,7 @@ var certFiles = []string{\n 	"/etc/ssl/certs/ca-certificates.crt", // Linux etc
 	"/etc/pki/tls/certs/ca-bundle.crt",   // Fedora/RHEL
 	"/etc/ssl/ca-bundle.pem",             // OpenSUSE
+\t"/etc/ssl/cert.pem",                  // OpenBSD
 }\n 
 func initDefaultRoots() {\n

変更の背景

Go言語の crypto/tls パッケージは、TLS (Transport Layer Security) プロトコルを実装しており、セキュアなネットワーク通信を提供します。TLS接続を確立する際、クライアントはサーバーから提示された証明書が信頼できる認証局 (CA) によって署名されていることを検証する必要があります。この検証プロセスには、システムにインストールされている信頼されたルート証明書(または中間証明書)のセットが必要です。

Goの crypto/tls パッケージは、Unix系システムにおいて、一般的なルート証明書の格納場所を複数ハードコードして検索します。しかし、OpenBSDは他の多くのLinuxディストリビューションやUnix系OSとは異なるパス /etc/ssl/cert.pem を標準的なルート証明書のバンドルファイルとして使用しています。

このコミット以前は、GoアプリケーションがOpenBSD上で動作する際に、システムが提供する信頼されたルート証明書を自動的に見つけることができず、TLS接続の検証に失敗する可能性がありました。これは、特にHTTPSクライアントや他のTLSベースのサービスを利用するGoアプリケーションにとって、大きな問題となります。この変更は、OpenBSD環境でのGoアプリケーションの互換性と信頼性を向上させるために行われました。

前提知識の解説

TLS (Transport Layer Security)

TLSは、インターネット上での通信のセキュリティを確保するための暗号化プロトコルです。ウェブブラウザとウェブサーバー間のHTTPS通信などで広く利用されています。TLSは、通信の盗聴、改ざん、なりすましを防ぐために、暗号化、認証、データ整合性の機能を提供します。

ルート証明書と認証局 (CA)

  • 認証局 (CA: Certificate Authority): デジタル証明書を発行し、その正当性を保証する信頼された第三者機関です。CAは、ウェブサイトやサーバーの身元を確認し、その情報を含むデジタル証明書に署名します。
  • ルート証明書: CAが自身を証明するために発行する自己署名証明書です。これは、信頼の連鎖の最上位に位置し、オペレーティングシステムやウェブブラウザに事前にインストールされています。
  • 証明書の検証: クライアント(例:ウェブブラウザ、Goアプリケーション)がサーバーから証明書を受け取ると、その証明書が信頼されたルート証明書によって署名されているか、または信頼されたルート証明書に連なる中間証明書によって署名されているかを検証します。この検証プロセスにより、クライアントは接続先のサーバーが正当であることを確認し、中間者攻撃などを防ぎます。

CA証明書バンドルファイル

多くのUnix系システムでは、複数の信頼されたルート証明書を1つのファイルにまとめた「CA証明書バンドルファイル」を使用します。これらのファイルは通常、PEM (Privacy-Enhanced Mail) 形式でエンコードされた複数の証明書を含んでいます。システムやディストリビューションによって、このファイルのパスやファイル名が異なります。

  • /etc/ssl/certs/ca-certificates.crt (Debian/UbuntuなどのLinux)
  • /etc/pki/tls/certs/ca-bundle.crt (Fedora/RHELなどのLinux)
  • /etc/ssl/ca-bundle.pem (OpenSUSEなど)
  • /etc/ssl/cert.pem (OpenBSD)

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

Go言語の標準ライブラリに含まれる crypto/tls パッケージは、TLSクライアントおよびサーバーの実装を提供します。このパッケージは、デフォルトでシステムのルート証明書ストアを利用して、サーバー証明書の検証を行います。x509.SystemCertPool() 関数が、OSの証明書ストアからルート証明書をロードする役割を担っています。この関数は、内部的に certFiles のようなハードコードされたパスリストを検索し、有効な証明書バンドルファイルを見つけようとします。

OpenBSD

OpenBSDは、セキュリティを最優先に設計されたUnix系オペレーティングシステムです。その設計思想から、ファイルシステムのレイアウトや設定ファイルのパスが他のOSと異なる場合があります。ルート証明書のバンドルファイル /etc/ssl/cert.pem もその一例です。

技術的詳細

Goの crypto/tls パッケージは、TLS接続の確立時にサーバー証明書の検証を行うために、信頼されたルート証明書のセットを必要とします。このセットは x509.CertPool オブジェクトとして表現されます。デフォルトでは、x509.SystemCertPool() 関数が呼び出され、オペレーティングシステムが提供するルート証明書をロードしようとします。

src/pkg/crypto/tls/root_unix.go ファイルは、Unix系システムにおけるこのルート証明書の検索ロジックを定義しています。具体的には、certFiles という文字列スライスに、既知のCA証明書バンドルファイルのパスがリストアップされています。initDefaultRoots() 関数(またはそれに相当する内部ロジック)が、この certFiles リストを順番に走査し、最初に見つかった有効なファイルを読み込んで x509.CertPool に追加します。

このコミットは、certFiles リストにOpenBSDの標準パスである /etc/ssl/cert.pem を追加することで、GoのTLS実装がOpenBSD環境で自動的にシステムのルート証明書を認識できるようにします。これにより、OpenBSDユーザーは、GoアプリケーションがTLS接続を行う際に、手動で証明書パスを設定したり、カスタムの証明書プールを構築したりする必要がなくなります。

この変更は、Goのクロスプラットフォーム互換性を高め、各OSの慣習に合わせた動作を保証する上で重要です。特に、セキュリティが重視されるTLS通信において、システムが信頼する証明書を正しく利用できることは、アプリケーションの信頼性と安全性を確保するために不可欠です。

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

変更は src/pkg/crypto/tls/root_unix.go ファイルの certFiles 変数に対して行われました。

--- a/src/pkg/crypto/tls/root_unix.go
+++ b/src/pkg/crypto/tls/root_unix.go
@@ -14,6 +14,7 @@ var certFiles = []string{\n 	"/etc/ssl/certs/ca-certificates.crt", // Linux etc
 	"/etc/pki/tls/certs/ca-bundle.crt",   // Fedora/RHEL
 	"/etc/ssl/ca-bundle.pem",             // OpenSUSE
+\t"/etc/ssl/cert.pem",                  // OpenBSD
 }\n 
 func initDefaultRoots() {\n

コアとなるコードの解説

certFiles は、Goの crypto/tls パッケージが信頼されたルート証明書を探す際に参照するファイルパスのリストです。このリストは、様々なUnix系オペレーティングシステムやディストリビューションで一般的に使用されるCA証明書バンドルファイルの場所を含んでいます。

追加された行 "/etc/ssl/cert.pem", // OpenBSD は、OpenBSDシステムがそのルート証明書を格納する標準的なパスを certFiles リストに加えるものです。これにより、GoのTLS実装は、他のOSのパスを試すのと同様に、OpenBSDのこのパスもチェックするようになります。

initDefaultRoots() 関数(またはその内部ロジック)がこの certFiles リストを反復処理し、ファイルが存在し、かつ有効な証明書バンドルである場合にそれを読み込み、デフォルトの証明書プールにロードします。この変更により、OpenBSD環境でGoアプリケーションがTLS接続を行う際に、システムが提供する信頼されたルート証明書を自動的に利用できるようになり、証明書検証エラーが減少します。

関連リンク

参考にした情報源リンク

  • Go言語のソースコード (特に src/crypto/tls/root_unix.go): https://github.com/golang/go/blob/master/src/crypto/tls/root_unix.go
  • OpenBSDの証明書管理に関する一般的な情報 (Web検索結果に基づく):
    • OpenBSDのmanページやドキュメント(例: ssl(8)x509(1)
    • 関連するフォーラムやメーリングリストの議論
  • TLS/SSLおよび証明書に関する一般的な情報 (Web検索結果に基づく):
    • MozillaのCA証明書プログラムに関するドキュメント
    • RFC 5246 (TLS 1.2)
    • デジタル証明書とPKIに関する解説記事 I have completed the request by generating the detailed technical explanation in Markdown format, following all the specified instructions and chapter structure. I have used the provided commit data and incorporated background knowledge about TLS, root certificates, and OpenBSD's file system conventions. I have also included relevant links. The response is ready to be outputted.# [インデックス 10539] ファイルの概要

このコミットは、Go言語の crypto/tls パッケージにおいて、OpenBSDオペレーティングシステムにおけるルート証明書の標準的な格納場所を追加するものです。これにより、OpenBSD環境でGoアプリケーションがTLS接続を確立する際に、システムにインストールされている信頼されたルート証明書を正しく利用できるようになります。

コミット

crypto/tls: add openbsd root certificate location

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

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

https://github.com/golang/go/commit/175e60a2ad47f477e5e3bfed83beaa9fe6a5ac85

元コミット内容

commit 175e60a2ad47f477e5e3bfed83beaa9fe6a5ac85
Author: Joel Sing <jsing@google.com>
Date:   Tue Nov 29 09:20:59 2011 -0500

    crypto/tls: add openbsd root certificate location
    
    R=golang-dev, bradfitz
    CC=golang-dev
    https://golang.org/cl/5437079
---
 src/pkg/crypto/tls/root_unix.go | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/pkg/crypto/tls/root_unix.go b/src/pkg/crypto/tls/root_unix.go
index 095beec104..1b9aeb03b5 100644
--- a/src/pkg/crypto/tls/root_unix.go
+++ b/src/pkg/crypto/tls/root_unix.go
@@ -14,6 +14,7 @@ var certFiles = []string{\n 	"/etc/ssl/certs/ca-certificates.crt", // Linux etc
 	"/etc/pki/tls/certs/ca-bundle.crt",   // Fedora/RHEL
 	"/etc/ssl/ca-bundle.pem",             // OpenSUSE
+\t"/etc/ssl/cert.pem",                  // OpenBSD
 }\n 
 func initDefaultRoots() {\n

変更の背景

Go言語の crypto/tls パッケージは、TLS (Transport Layer Security) プロトコルを実装しており、セキュアなネットワーク通信を提供します。TLS接続を確立する際、クライアントはサーバーから提示された証明書が信頼できる認証局 (CA) によって署名されていることを検証する必要があります。この検証プロセスには、システムにインストールされている信頼されたルート証明書(または中間証明書)のセットが必要です。

Goの crypto/tls パッケージは、Unix系システムにおいて、一般的なルート証明書の格納場所を複数ハードコードして検索します。しかし、OpenBSDは他の多くのLinuxディストリビューションやUnix系OSとは異なるパス /etc/ssl/cert.pem を標準的なルート証明書のバンドルファイルとして使用しています。

このコミット以前は、GoアプリケーションがOpenBSD上で動作する際に、システムが提供する信頼されたルート証明書を自動的に見つけることができず、TLS接続の検証に失敗する可能性がありました。これは、特にHTTPSクライアントや他のTLSベースのサービスを利用するGoアプリケーションにとって、大きな問題となります。この変更は、OpenBSD環境でのGoアプリケーションの互換性と信頼性を向上させるために行われました。

前提知識の解説

TLS (Transport Layer Security)

TLSは、インターネット上での通信のセキュリティを確保するための暗号化プロトコルです。ウェブブラウザとウェブサーバー間のHTTPS通信などで広く利用されています。TLSは、通信の盗聴、改ざん、なりすましを防ぐために、暗号化、認証、データ整合性の機能を提供します。

ルート証明書と認証局 (CA)

  • 認証局 (CA: Certificate Authority): デジタル証明書を発行し、その正当性を保証する信頼された第三者機関です。CAは、ウェブサイトやサーバーの身元を確認し、その情報を含むデジタル証明書に署名します。
  • ルート証明書: CAが自身を証明するために発行する自己署名証明書です。これは、信頼の連鎖の最上位に位置し、オペレーティングシステムやウェブブラウザに事前にインストールされています。
  • 証明書の検証: クライアント(例:ウェブブラウザ、Goアプリケーション)がサーバーから証明書を受け取ると、その証明書が信頼されたルート証明書によって署名されているか、または信頼されたルート証明書に連なる中間証明書によって署名されているかを検証します。この検証プロセスにより、クライアントは接続先のサーバーが正当であることを確認し、中間者攻撃などを防ぎます。

CA証明書バンドルファイル

多くのUnix系システムでは、複数の信頼されたルート証明書を1つのファイルにまとめた「CA証明書バンドルファイル」を使用します。これらのファイルは通常、PEM (Privacy-Enhanced Mail) 形式でエンコードされた複数の証明書を含んでいます。システムやディストリビューションによって、このファイルのパスやファイル名が異なります。

  • /etc/ssl/certs/ca-certificates.crt (Debian/UbuntuなどのLinux)
  • /etc/pki/tls/certs/ca-bundle.crt (Fedora/RHELなどのLinux)
  • /etc/ssl/ca-bundle.pem (OpenSUSEなど)
  • /etc/ssl/cert.pem (OpenBSD)

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

Go言語の標準ライブラリに含まれる crypto/tls パッケージは、TLSクライアントおよびサーバーの実装を提供します。このパッケージは、デフォルトでシステムのルート証明書ストアを利用して、サーバー証明書の検証を行います。x509.SystemCertPool() 関数が、OSの証明書ストアからルート証明書をロードする役割を担っています。この関数は、内部的に certFiles のようなハードコードされたパスリストを検索し、有効な証明書バンドルファイルを見つけようとします。

OpenBSD

OpenBSDは、セキュリティを最優先に設計されたUnix系オペレーティングシステムです。その設計思想から、ファイルシステムのレイアウトや設定ファイルのパスが他のOSと異なる場合があります。ルート証明書のバンドルファイル /etc/ssl/cert.pem もその一例です。

技術的詳細

Goの crypto/tls パッケージは、TLS接続の確立時にサーバー証明書の検証を行うために、信頼されたルート証明書のセットを必要とします。このセットは x509.CertPool オブジェクトとして表現されます。デフォルトでは、x509.SystemCertPool() 関数が呼び出され、オペレーティングシステムが提供するルート証明書をロードしようとします。

src/pkg/crypto/tls/root_unix.go ファイルは、Unix系システムにおけるこのルート証明書の検索ロジックを定義しています。具体的には、certFiles という文字列スライスに、既知のCA証明書バンドルファイルのパスがリストアップされています。initDefaultRoots() 関数(またはそれに相当する内部ロジック)が、この certFiles リストを順番に走査し、最初に見つかった有効なファイルを読み込んで x509.CertPool に追加します。

このコミットは、certFiles リストにOpenBSDの標準パスである /etc/ssl/cert.pem を追加することで、GoのTLS実装がOpenBSD環境で自動的にシステムのルート証明書を認識できるようにします。これにより、OpenBSDユーザーは、GoアプリケーションがTLS接続を行う際に、手動で証明書パスを設定したり、カスタムの証明書プールを構築したりする必要がなくなります。

この変更は、Goのクロスプラットフォーム互換性を高め、各OSの慣習に合わせた動作を保証する上で重要です。特に、セキュリティが重視されるTLS通信において、システムが信頼する証明書を正しく利用できることは、アプリケーションの信頼性と安全性を確保するために不可欠です。

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

変更は src/pkg/crypto/tls/root_unix.go ファイルの certFiles 変数に対して行われました。

--- a/src/pkg/crypto/tls/root_unix.go
+++ b/src/pkg/crypto/tls/root_unix.go
@@ -14,6 +14,7 @@ var certFiles = []string{\n 	"/etc/ssl/certs/ca-certificates.crt", // Linux etc
 	"/etc/pki/tls/certs/ca-bundle.crt",   // Fedora/RHEL
 	"/etc/ssl/ca-bundle.pem",             // OpenSUSE
+\t"/etc/ssl/cert.pem",                  // OpenBSD
 }\n 
 func initDefaultRoots() {\n

コアとなるコードの解説

certFiles は、Goの crypto/tls パッケージが信頼されたルート証明書を探す際に参照するファイルパスのリストです。このリストは、様々なUnix系オペレーティングシステムやディストリビューションで一般的に使用されるCA証明書バンドルファイルの場所を含んでいます。

追加された行 "/etc/ssl/cert.pem", // OpenBSD は、OpenBSDシステムがそのルート証明書を格納する標準的なパスを certFiles リストに加えるものです。これにより、GoのTLS実装は、他のOSのパスを試すのと同様に、OpenBSDのこのパスもチェックするようになります。

initDefaultRoots() 関数(またはその内部ロジック)がこの certFiles リストを反復処理し、ファイルが存在し、かつ有効な証明書バンドルである場合にそれを読み込み、デフォルトの証明書プールにロードします。この変更により、OpenBSD環境でGoアプリケーションがTLS接続を行う際に、システムが提供する信頼されたルート証明書を自動的に利用できるようになり、証明書検証エラーが減少します。

関連リンク

参考にした情報源リンク

  • Go言語のソースコード (特に src/crypto/tls/root_unix.go): https://github.com/golang/go/blob/master/src/crypto/tls/root_unix.go
  • OpenBSDの証明書管理に関する一般的な情報 (Web検索結果に基づく):
    • OpenBSDのmanページやドキュメント(例: ssl(8)x509(1)
    • 関連するフォーラムやメーリングリストの議論
  • TLS/SSLおよび証明書に関する一般的な情報 (Web検索結果に基づく):
    • MozillaのCA証明書プログラムに関するドキュメント
    • RFC 5246 (TLS 1.2)
    • デジタル証明書とPKIに関する解説記事