[インデックス 17656] ファイルの概要
このコミットは、Go言語の crypto/x509
パッケージ内の root_unix.go
ファイルにおけるコメントの更新です。具体的には、Unix系システムでルート証明書が配置される可能性のあるパスの一つである /etc/ssl/certs/ca-certificates.crt
についてのコメントを、「Linux etc」から「Debian/Ubuntu/Gentoo etc.」へとより具体的に修正しています。これはコードの動作には影響を与えず、ドキュメンテーションの正確性を向上させるための変更です。
コミット
commit 318e165238e1f7a18650c71496118bd6ad0ff736
Author: David Symonds <dsymonds@golang.org>
Date: Fri Sep 20 15:49:26 2013 +1000
crypto/x509: update comment on system root cert locations.
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/13775045
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/318e165238e1f7a18650c71496118bd6ad0ff736
元コミット内容
crypto/x509: update comment on system root cert locations.
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/13775045
変更の背景
この変更の背景には、Go言語の crypto/x509
パッケージが、TLS/SSL通信などで必要となる信頼されたルート証明書をUnix系システム上で探索する際のパスに関するコメントの正確性を向上させる意図があります。
以前のコメント「Linux etc」は、/etc/ssl/certs/ca-certificates.crt
が多くのLinuxディストリビューションで利用される一般的なパスであることを示していましたが、より具体的に「Debian/Ubuntu/Gentoo etc.」と記述することで、このパスが特にこれらのディストリビューションで標準的に使用されていることを明確にしています。これにより、コードを読む開発者や、Goアプリケーションが証明書をどのように探索するかを理解しようとするユーザーに対して、より正確な情報を提供することが目的です。
これは機能的な変更ではなく、ドキュメンテーションの改善であり、コードの可読性と保守性を高めるための一般的なプラクティスの一環です。
前提知識の解説
1. crypto/x509
パッケージ
Go言語の標準ライブラリに含まれる crypto/x509
パッケージは、X.509証明書とPKIX (Public Key Infrastructure for X.509) の実装を提供します。このパッケージは、TLS (Transport Layer Security) やその他のセキュリティプロトコルにおいて、証明書の検証、署名、解析などの操作を行うために不可欠です。
主な機能としては、以下のようなものがあります。
- 証明書の解析と検証: PEM (Privacy-Enhanced Mail) や DER (Distinguished Encoding Rules) 形式の証明書を読み込み、その有効性(有効期限、署名、証明書チェーンなど)を検証します。
- 証明書プール: 信頼されたルート証明書(CA証明書)のコレクションを管理し、それらを使用して他の証明書を検証します。
- 証明書署名リクエスト (CSR): 新しい証明書を要求するためのCSRを生成・解析します。
2. ルート証明書とCA証明書
- ルート証明書 (Root Certificate): 認証局 (CA: Certificate Authority) の公開鍵証明書のうち、自己署名された最上位の証明書です。これは、信頼の連鎖の起点となります。オペレーティングシステムやブラウザには、信頼できる主要なCAのルート証明書があらかじめインストールされています。
- CA証明書 (Certificate Authority Certificate): ルート証明書を含む、中間CAによって発行された証明書もCA証明書と呼ばれます。これらは、ウェブサイトやサーバーの証明書が正当であることを検証するために使用されます。
TLS/SSL通信では、クライアント(例: Goアプリケーション)がサーバーの証明書を受け取った際、その証明書が信頼できるCAによって発行されたものであることを検証する必要があります。この検証プロセスでは、サーバー証明書から始まり、中間CA証明書をたどり、最終的に信頼されたルート証明書に到達することで、信頼の連鎖が確立されます。
3. /etc/ssl/certs/ca-certificates.crt
これは、多くのUnix系(特にDebian、Ubuntu、Gentooなどのdpkg
ベースまたはportage
ベースのディストリビューション)Linuxシステムで、システム全体の信頼されたCA証明書が格納されているファイルパスです。このファイルは、通常、複数のPEM形式のCA証明書が連結されたものです。
システム上のアプリケーション(Goプログラムを含む)は、このファイルを参照して、TLS接続の際にサーバー証明書の信頼性を検証します。このファイルは、ca-certificates
パッケージによって管理されており、新しいCA証明書が追加されたり、古いCA証明書が失効したりすると、システムによって自動的に更新されます。
4. Linuxディストリビューションにおける証明書管理
Linuxディストリビューションは、それぞれ異なる方法でシステム全体のCA証明書を管理しています。
- Debian/Ubuntu/Gentoo: 主に
/etc/ssl/certs/ca-certificates.crt
を使用し、update-ca-certificates
コマンドで管理されます。 - Fedora/RHEL/CentOS: 主に
/etc/pki/tls/certs/ca-bundle.crt
を使用し、update-ca-trust
コマンドで管理されます。 - OpenSUSE:
/etc/ssl/ca-bundle.pem
などを使用します。 - OpenBSD:
/etc/ssl/cert.pem
などを使用します。
Goの crypto/x509
パッケージは、これらの異なるパスを certFiles
変数にリストアップし、システム上で利用可能な最初のパスを見つけてCA証明書をロードしようとします。これにより、Goアプリケーションは様々なUnix系環境で適切に動作することができます。
技術的詳細
このコミットは、src/pkg/crypto/x509/root_unix.go
ファイル内の certFiles
変数の定義におけるコメントを修正するものです。
certFiles
変数は、Goの crypto/x509
パッケージがUnix系システム上で信頼されたルート証明書を探索する際に試行するファイルパスのリストを定義しています。このリストは、異なるLinuxディストリビューションやUnix系OSがCA証明書を格納する標準的な場所を網羅しています。
変更前は、/etc/ssl/certs/ca-certificates.crt
のコメントが「Linux etc」となっていました。これは、このパスが一般的なLinuxシステムで使われることを示唆していましたが、より具体的な情報が求められました。
変更後は、コメントが「Debian/Ubuntu/Gentoo etc.」となりました。これは、/etc/ssl/certs/ca-certificates.crt
が特にDebian、Ubuntu、Gentooといったディストリビューションで標準的に使用されることを明確にしています。これらのディストリビューションは、ca-certificates
パッケージと update-ca-certificates
ユーティリティを使用して、このファイルを管理しています。
この修正は、コードの動作には一切影響を与えません。Goランタイムは引き続き、このリストに記載された順序でパスを試行し、最初に見つかった有効な証明書ファイルを使用します。この変更の唯一の目的は、コードのドキュメンテーションをより正確にし、特定のパスがどのLinuxディストリビューションと強く関連しているかを開発者に伝えることです。これにより、Goの証明書探索ロジックを理解しようとする際の混乱を減らし、コードの可読性を向上させます。
コアとなるコードの変更箇所
--- a/src/pkg/crypto/x509/root_unix.go
+++ b/src/pkg/crypto/x509/root_unix.go
@@ -10,7 +10,7 @@ import "io/ioutil"
// Possible certificate files; stop after finding one.
var certFiles = []string{
- "/etc/ssl/certs/ca-certificates.crt", // Linux etc
+ "/etc/ssl/certs/ca-certificates.crt", // Debian/Ubuntu/Gentoo etc.
"/etc/pki/tls/certs/ca-bundle.crt", // Fedora/RHEL
"/etc/ssl/ca-bundle.pem", // OpenSUSE
"/etc/ssl/cert.pem", // OpenBSD
コアとなるコードの解説
変更されたのは、src/pkg/crypto/x509/root_unix.go
ファイル内の certFiles
スライス(Go言語における配列のようなもの)の定義です。
certFiles
は、Goの crypto/x509
パッケージがシステムルート証明書をロードするために試行する、Unix系システム上のファイルパスの優先順位付きリストです。このリストは、異なるLinuxディストリビューションやUnix系OSがCA証明書を格納する一般的な場所を考慮して作成されています。
変更前は、リストの最初の要素である /etc/ssl/certs/ca-certificates.crt
のコメントが // Linux etc
となっていました。これは、このパスが一般的なLinuxシステムで使われることを示していました。
今回のコミットでは、このコメントが // Debian/Ubuntu/Gentoo etc.
に変更されました。この修正は、この特定のパスが特にDebian、Ubuntu、Gentooといったディストリビューションで標準的に使用されることをより正確に反映しています。これらのディストリビューションでは、ca-certificates
パッケージがこのファイルを管理し、システム全体の信頼されたCA証明書を提供しています。
この変更は、コードの実行には全く影響を与えません。Goランタイムは引き続き、このリストを上から順に走査し、最初に見つかった有効な証明書ファイルを使用してルート証明書プールを構築します。この修正は純粋にドキュメンテーションの改善であり、コードの可読性と、特定のファイルパスがどのOS環境と関連が深いかについての正確な情報を提供することを目的としています。
関連リンク
- Gerrit Change-ID: https://golang.org/cl/13775045
参考にした情報源リンク
- Go言語
crypto/x509
パッケージのドキュメンテーション: https://pkg.go.dev/crypto/x509 - Debian Wiki - CA certificates: https://wiki.debian.org/CAcert
- Ubuntu Documentation - Certificates: https://ubuntu.com/server/docs/security-certificates
- Gentoo Wiki - Certificates: https://wiki.gentoo.org/wiki/Certificates
- Red Hat Enterprise Linux - Managing trusted CAs: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/security_guide/chap-security_guide-certificate_management
- OpenBSD man page for
cert.pem
: (具体的なURLは環境によるが、man cert.pem
で参照可能) - X.509 Certificate Standard: https://www.itu.int/rec/T-REC-X.509