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

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

このコミットは、Go言語の crypto/x509 パッケージにおける証明書検証テストの挙動を修正するものです。具体的には、Windows環境下で SystemRootsError を期待するテストが常にスキップされるように変更されています。これは、Windowsの証明書検証がGo独自のロジックではなく、OSネイティブのCryptoAPIを使用するため、SystemRootsError が発生しないという特性に対応するための修正です。

コミット

commit 249af5c85eb0ba05592ea3ffac71c4a2f824a216
Author: Mikkel Krautz <mikkel@krautz.dk>
Date:   Thu Jan 24 01:20:17 2013 +0800

    crypto/x509: skip SystemRootsError test on Windows
    
    On Windows, crypto/x509 passes through to Windows's CryptoAPI
    to verify certificate chains. This method can't produce a
    SystemRootsError, so make sure we always skip the test on
    Windows.
    
    This is needed because testVerify is called in both
    TestGoVerify and TestSystemVerify on Windows - one is for
    testing the Go verifier, the other one is for testing the
    CryptoAPI verifier. The orignal CL tried to sidestep
    this issue by setting systemSkip to true, but that only
    affected TestSystemVerify.
    
    R=golang-dev, agl, snaury, minux.ma
    CC=golang-dev
    https://golang.org/cl/7185043

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

https://github.com/golang/go/commit/249af5c85eb0ba05592ea3ffac71c4a2f824a216

元コミット内容

crypto/x509: skip SystemRootsError test on Windows

On Windows, crypto/x509 passes through to Windows's CryptoAPI
to verify certificate chains. This method can't produce a
SystemRootsError, so make sure we always skip the test on
Windows.

This is needed because testVerify is called in both
TestGoVerify and TestSystemVerify on Windows - one is for
testing the Go verifier, the other one is for testing the
CryptoAPI verifier. The orignal CL tried to sidestep
this issue by setting systemSkip to true, but that only
affected TestSystemVerify.

R=golang-dev, agl, snaury, minux.ma
CC=golang-dev
https://golang.org/cl/7185043

変更の背景

Go言語の crypto/x509 パッケージは、X.509証明書の解析、検証、および操作を行うための機能を提供します。証明書チェーンの検証は、SSL/TLS通信のセキュリティを確保する上で非常に重要なプロセスです。この検証プロセスでは、証明書が信頼できる認証局(CA)によって発行されたものであるか、有効期限内であるか、失効していないかなどを確認します。

Goの crypto/x509 パッケージは、クロスプラットフォームで動作するように設計されていますが、OS固有の機能を利用することでパフォーマンスや互換性を向上させることがあります。Windows環境においては、Goは証明書チェーンの検証にWindowsのネイティブなCryptoAPI(Cryptographic Application Programming Interface)を利用します。これは、Windowsが独自の証明書ストアと検証メカニズムを持っているためです。

SystemRootsError は、Goの crypto/x509 パッケージが証明書チェーンを検証する際に、システムに信頼されたルート証明書が見つからない場合に発生するエラーです。しかし、WindowsのCryptoAPIは、Goの内部的なルート証明書プールとは異なる方法でシステムルート証明書を管理し、検証を行います。このため、Goの内部的な検証ロジックで発生する SystemRootsError が、WindowsのCryptoAPIを使用した検証では発生しないという問題がありました。

既存のテストスイートには、意図的にルート証明書を指定しないことで SystemRootsError の発生を期待するテストケースが含まれていました。しかし、Windows環境でこれらのテストを実行すると、CryptoAPIが使用されるため SystemRootsError が発生せず、テストが失敗するという問題が生じていました。

このコミットは、このWindows環境でのテスト失敗を解決するために導入されました。以前の試みでは systemSkip フラグを設定することでこの問題を回避しようとしましたが、これは TestSystemVerify にのみ影響し、TestGoVerify には影響しませんでした。testVerify 関数は TestGoVerifyTestSystemVerify の両方から呼び出されるため、testSystemRootsErrortrue の場合にWindows環境であれば常にテストをスキップするように修正されました。

前提知識の解説

X.509 証明書と証明書チェーン

X.509は、公開鍵証明書の標準フォーマットです。インターネット上の通信において、エンティティ(ウェブサイト、サーバー、個人など)の身元を検証するために広く使用されています。X.509証明書には、公開鍵、所有者の情報、発行者の情報、有効期限、デジタル署名などが含まれます。

**証明書チェーン(Certificate Chain)**は、エンドエンティティ証明書(例: ウェブサイトのSSL証明書)から始まり、中間認証局(Intermediate CA)の証明書を介して、最終的に信頼されたルート認証局(Root CA)の証明書に至る一連の証明書のことです。検証プロセスでは、このチェーンを辿り、各証明書が正しく署名され、信頼できるものであることを確認します。

crypto/x509 パッケージ (Go言語)

Go言語の標準ライブラリに含まれる crypto/x509 パッケージは、X.509証明書のエンコード、デコード、解析、および検証機能を提供します。このパッケージは、TLS(Transport Layer Security)やその他のセキュリティプロトコルにおいて、証明書ベースの認証を実装するために不可欠です。

Verify メソッドは、証明書チェーンの検証を行う主要な関数の一つです。このメソッドは、与えられた証明書が信頼できるルート証明書にまで遡って検証できるか、有効期限内であるか、失効していないかなどをチェックします。

SystemRootsError

SystemRootsError は、Goの crypto/x509 パッケージが証明書チェーンを検証する際に、システムに信頼されたルート証明書が見つからない場合に発生するエラーです。これは通常、証明書チェーンの検証に必要なルート証明書が、Goが管理する証明書プール(x509.CertPool)内に存在しない場合に発生します。

Windows CryptoAPI

Windows CryptoAPI(Cryptographic Application Programming Interface)は、Microsoft Windowsオペレーティングシステムが提供する暗号化サービス群です。これには、証明書の管理、公開鍵暗号、ハッシュ関数、デジタル署名などの機能が含まれます。Windowsアプリケーションは、CryptoAPIを利用してセキュリティ関連の操作を実行します。

特に、証明書検証においては、Windowsは独自のシステム証明書ストア(Trusted Root Certification Authoritiesなど)を持っており、CryptoAPIを通じてこれらのストアにアクセスし、証明書チェーンの検証を行います。Goの crypto/x509 パッケージは、Windows環境ではこのネイティブなCryptoAPIを内部的に利用することで、OSの証明書管理システムと連携し、よりシームレスな証明書検証を実現しています。

runtime.GOOS

runtime.GOOS はGo言語の標準ライブラリ runtime パッケージで提供される定数で、プログラムが実行されているオペレーティングシステムの名前を表します。例えば、Windowsでは "windows"、Linuxでは "linux"、macOSでは "darwin" となります。この定数を利用することで、OSに依存する処理を条件分岐で記述することができます。

技術的詳細

このコミットの核心は、Goの crypto/x509 パッケージがWindows環境で証明書検証を行う際の挙動の違いにあります。

  1. Goの証明書検証ロジック: 通常、Goの crypto/x509 パッケージは、独自の x509.CertPool を使用して信頼されたルート証明書を管理し、それに基づいて証明書チェーンを検証します。このプロセスにおいて、信頼できるルート証明書が見つからない場合に SystemRootsError が発生します。

  2. Windows環境での特殊な挙動: Windowsでは、GoはOSネイティブのCryptoAPIを利用して証明書検証を行います。これは、Windowsが独自のシステム証明書ストア(例: Cert:\LocalMachine\Root)を持っており、Goがそのストアにアクセスして検証を行うためです。CryptoAPIはGoの内部的な SystemRootsError の概念とは異なるエラーハンドリングメカニズムを持っています。そのため、Goの内部ロジックで SystemRootsError が発生するような状況でも、CryptoAPIは異なる種類のエラーを返すか、あるいはエラーを返さない可能性があります。

  3. テストの課題: src/pkg/crypto/x509/verify_test.go には、testSystemRootsError: true が設定されたテストケースが存在します。このテストケースは、意図的にルート証明書を指定しないことで SystemRootsError が発生することを期待しています。しかし、Windows環境ではCryptoAPIが使用されるため、このテストケースが期待する SystemRootsError が発生せず、テストが失敗していました。

  4. 以前の試みと問題点: コミットメッセージによると、以前の変更では systemSkip: true を設定することでこの問題を回避しようとしました。しかし、testVerify 関数は TestGoVerify(Go独自の検証ロジックをテスト)と TestSystemVerify(CryptoAPIを利用したシステム検証をテスト)の両方から呼び出されます。systemSkipTestSystemVerify にのみ影響を与え、TestGoVerify には影響しませんでした。結果として、TestGoVerify がWindows上で SystemRootsError を期待するテストケースで失敗し続けていました。

  5. 今回の修正: このコミットでは、testVerify 関数内に runtime.GOOS == "windows" && test.testSystemRootsError という条件を追加しました。これにより、テストがWindows上で実行されており、かつそのテストケースが SystemRootsError の発生を期待している場合、そのテストケースはスキップされるようになります。この修正により、Windows環境でのテストの安定性が向上し、Goの crypto/x509 パッケージがWindowsのCryptoAPIと連携する際の挙動の違いが適切に考慮されるようになりました。

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

--- a/src/pkg/crypto/x509/verify_test.go
+++ b/src/pkg/crypto/x509/verify_test.go
@@ -35,7 +35,6 @@ var verifyTests = []verifyTest{
 	\t\tcurrentTime:          1302726541,
 	\t\tdnsName:              "www.google.com",
 	\t\ttestSystemRootsError: true,
-\t\t\tsystemSkip:           true,

 	\t\t// Without any roots specified we should get a system roots
 	\t\t// error.
@@ -214,6 +213,9 @@ func testVerify(t *testing.T, useSystemRoots bool) {
 	\tif useSystemRoots && test.systemSkip {\n \t\t\tcontinue\n \t\t}\n+\t\tif runtime.GOOS == "windows" && test.testSystemRootsError {\n+\t\t\tcontinue\n+\t\t}\n
 	\topts := VerifyOptions{
 	\t\tIntermediates: NewCertPool(),

コアとなるコードの解説

このコミットでは、src/pkg/crypto/x509/verify_test.go ファイル内の testVerify 関数が変更されています。

  1. verifyTests 配列からの systemSkip の削除:

    -		systemSkip:           true,
    

    verifyTests 配列内の特定のテストケースから systemSkip: true の行が削除されました。これは、以前の systemSkip フラグが TestSystemVerify にしか影響せず、TestGoVerify には影響しなかったため、より汎用的なスキップロジックを導入するために不要になったためです。

  2. testVerify 関数内の条件分岐の追加:

    	if runtime.GOOS == "windows" && test.testSystemRootsError {
    		continue
    	}
    

    testVerify 関数内に上記の新しい条件分岐が追加されました。

    • runtime.GOOS == "windows": これは、現在のテストがWindowsオペレーティングシステム上で実行されているかどうかをチェックします。
    • test.testSystemRootsError: これは、現在の verifyTest 構造体(テストケース)が SystemRootsError の発生を期待しているかどうかを示すフラグです。

    この2つの条件が両方とも true の場合、つまり「Windows上で実行されており、かつ SystemRootsError を期待するテストケースである」場合に、continue ステートメントが実行されます。continue はループの現在のイテレーションをスキップし、次のイテレーションに進むため、この特定のテストケースはWindows上では実行されなくなります。

この変更により、Windows環境で SystemRootsError を期待するテストケースが適切にスキップされるようになり、Goの crypto/x509 パッケージがWindowsのCryptoAPIを利用する際の挙動の違いによるテストの失敗が解消されました。

関連リンク

参考にした情報源リンク

このコミットは、Go言語の crypto/x509 パッケージにおける証明書検証テストの挙動を修正するものです。具体的には、Windows環境下で SystemRootsError を期待するテストが常にスキップされるように変更されています。これは、Windowsの証明書検証がGo独自のロジックではなく、OSネイティブのCryptoAPIを使用するため、SystemRootsError が発生しないという特性に対応するための修正です。

コミット

commit 249af5c85eb0ba05592ea3ffac71c4a2f824a216
Author: Mikkel Krautz <mikkel@krautz.dk>
Date:   Thu Jan 24 01:20:17 2013 +0800

    crypto/x509: skip SystemRootsError test on Windows
    
    On Windows, crypto/x509 passes through to Windows's CryptoAPI
    to verify certificate chains. This method can't produce a
    SystemRootsError, so make sure we always skip the test on
    Windows.
    
    This is needed because testVerify is called in both
    TestGoVerify and TestSystemVerify on Windows - one is for
    testing the Go verifier, the other one is for testing the
    CryptoAPI verifier. The orignal CL tried to sidestep
    this issue by setting systemSkip to true, but that only
    affected TestSystemVerify.
    
    R=golang-dev, agl, snaury, minux.ma
    CC=golang-dev
    https://golang.org/cl/7185043

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

https://github.com/golang/go/commit/249af5c85eb0ba05592ea3ffac71c4a2f824a216

元コミット内容

crypto/x509: skip SystemRootsError test on Windows

On Windows, crypto/x509 passes through to Windows's CryptoAPI
to verify certificate chains. This method can't produce a
SystemRootsError, so make sure we always skip the test on
Windows.

This is needed because testVerify is called in both
TestGoVerify and TestSystemVerify on Windows - one is for
testing the Go verifier, the other one is for testing the
CryptoAPI verifier. The orignal CL tried to sidestep
this issue by setting systemSkip to true, but that only
affected TestSystemVerify.

R=golang-dev, agl, snaury, minux.ma
CC=golang-dev
https://golang.org/cl/7185043

変更の背景

Go言語の crypto/x509 パッケージは、X.509証明書の解析、検証、および操作を行うための機能を提供します。証明書チェーンの検証は、SSL/TLS通信のセキュリティを確保する上で非常に重要なプロセスです。この検証プロセスでは、証明書が信頼できる認証局(CA)によって発行されたものであるか、有効期限内であるか、失効していないかなどを確認します。

Goの crypto/x509 パッケージは、クロスプラットフォームで動作するように設計されていますが、OS固有の機能を利用することでパフォーマンスや互換性を向上させることがあります。Windows環境においては、Goは証明書チェーンの検証にWindowsのネイティブなCryptoAPI(Cryptographic Application Programming Interface)を利用します。これは、Windowsが独自の証明書ストアと検証メカニズムを持っているためです。

SystemRootsError は、Goの crypto/x509 パッケージが証明書チェーンを検証する際に、システムに信頼されたルート証明書が見つからない場合に発生するエラーです。しかし、WindowsのCryptoAPIは、Goの内部的なルート証明書プールとは異なる方法でシステムルート証明書を管理し、検証を行います。このため、Goの内部的な検証ロジックで発生する SystemRootsError が、WindowsのCryptoAPIを使用した検証では発生しないという問題がありました。

既存のテストスイートには、意図的にルート証明書を指定しないことで SystemRootsError の発生を期待するテストケースが含まれていました。しかし、Windows環境でこれらのテストを実行すると、CryptoAPIが使用されるため SystemRootsError が発生せず、テストが失敗するという問題が生じていました。

このコミットは、このWindows環境でのテスト失敗を解決するために導入されました。以前の試みでは systemSkip フラグを設定することでこの問題を回避しようとしましたが、これは TestSystemVerify にのみ影響し、TestGoVerify には影響しませんでした。testVerify 関数は TestGoVerifyTestSystemVerify の両方から呼び出されるため、testSystemRootsErrortrue の場合にWindows環境であれば常にテストをスキップするように修正されました。

前提知識の解説

X.509 証明書と証明書チェーン

X.509は、公開鍵証明書の標準フォーマットです。インターネット上の通信において、エンティティ(ウェブサイト、サーバー、個人など)の身元を検証するために広く使用されています。X.509証明書には、公開鍵、所有者の情報、発行者の情報、有効期限、デジタル署名などが含まれます。

**証明書チェーン(Certificate Chain)**は、エンドエンティティ証明書(例: ウェブサイトのSSL証明書)から始まり、中間認証局(Intermediate CA)の証明書を介して、最終的に信頼されたルート認証局(Root CA)の証明書に至る一連の証明書のことです。検証プロセスでは、このチェーンを辿り、各証明書が正しく署名され、信頼できるものであることを確認します。

crypto/x509 パッケージ (Go言語)

Go言語の標準ライブラリに含まれる crypto/x509 パッケージは、X.509証明書のエンコード、デコード、解析、および検証機能を提供します。このパッケージは、TLS(Transport Layer Security)やその他のセキュリティプロトコルにおいて、証明書ベースの認証を実装するために不可欠です。

Verify メソッドは、証明書チェーンの検証を行う主要な関数の一つです。このメソッドは、与えられた証明書が信頼できるルート証明書にまで遡って検証できるか、有効期限内であるか、失効していないかなどをチェックします。

SystemRootsError

SystemRootsError は、Goの crypto/x509 パッケージが証明書チェーンを検証する際に、システムに信頼されたルート証明書が見つからない場合に発生するエラーです。これは通常、証明書チェーンの検証に必要なルート証明書が、Goが管理する証明書プール(x509.CertPool)内に存在しない場合に発生します。

Windows CryptoAPI

Windows CryptoAPI(Cryptographic Application Programming Interface)は、Microsoft Windowsオペレーティングシステムが提供する暗号化サービス群です。これには、証明書の管理、公開鍵暗号、ハッシュ関数、デジタル署名などの機能が含まれます。Windowsアプリケーションは、CryptoAPIを利用してセキュリティ関連の操作を実行します。

特に、証明書検証においては、Windowsは独自のシステム証明書ストア(Trusted Root Certification Authoritiesなど)を持っており、CryptoAPIを通じてこれらのストアにアクセスし、証明書チェーンの検証を行います。Goの crypto/x509 パッケージは、Windows環境ではこのネイティブなCryptoAPIを内部的に利用することで、OSの証明書管理システムと連携し、よりシームレスな証明書検証を実現しています。

runtime.GOOS

runtime.GOOS はGo言語の標準ライブラリ runtime パッケージで提供される定数で、プログラムが実行されているオペレーティングシステムの名前を表します。例えば、Windowsでは "windows"、Linuxでは "linux"、macOSでは "darwin" となります。この定数を利用することで、OSに依存する処理を条件分岐で記述することができます。

技術的詳細

このコミットの核心は、Goの crypto/x509 パッケージがWindows環境で証明書検証を行う際の挙動の違いにあります。

  1. Goの証明書検証ロジック: 通常、Goの crypto/x509 パッケージは、独自の x509.CertPool を使用して信頼されたルート証明書を管理し、それに基づいて証明書チェーンを検証します。このプロセスにおいて、信頼できるルート証明書が見つからない場合に SystemRootsError が発生します。

  2. Windows環境での特殊な挙動: Windowsでは、GoはOSネイティブのCryptoAPIを利用して証明書検証を行います。これは、Windowsが独自のシステム証明書ストア(例: Cert:\LocalMachine\Root)を持っており、Goがそのストアにアクセスして検証を行うためです。CryptoAPIはGoの内部的な SystemRootsError の概念とは異なるエラーハンドリングメカニズムを持っています。そのため、Goの内部ロジックで SystemRootsError が発生するような状況でも、CryptoAPIは異なる種類のエラーを返すか、あるいはエラーを返さない可能性があります。

  3. テストの課題: src/pkg/crypto/x509/verify_test.go には、testSystemRootsError: true が設定されたテストケースが存在します。このテストケースは、意図的にルート証明書を指定しないことで SystemRootsError が発生することを期待しています。しかし、Windows環境ではCryptoAPIが使用されるため、このテストケースが期待する SystemRootsError が発生せず、テストが失敗していました。

  4. 以前の試みと問題点: コミットメッセージによると、以前の変更では systemSkip フラグを設定することでこの問題を回避しようとしました。しかし、testVerify 関数は TestGoVerify(Go独自の検証ロジックをテスト)と TestSystemVerify(CryptoAPIを利用したシステム検証をテスト)の両方から呼び出されます。systemSkipTestSystemVerify にのみ影響を与え、TestGoVerify には影響しませんでした。結果として、TestGoVerify がWindows上で SystemRootsError を期待するテストケースで失敗し続けていました。

  5. 今回の修正: このコミットでは、testVerify 関数内に runtime.GOOS == "windows" && test.testSystemRootsError という条件を追加しました。これにより、テストがWindows上で実行されており、かつそのテストケースが SystemRootsError の発生を期待している場合、そのテストケースはスキップされるようになります。この修正により、Windows環境でのテストの安定性が向上し、Goの crypto/x509 パッケージがWindowsのCryptoAPIと連携する際の挙動の違いが適切に考慮されるようになりました。

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

--- a/src/pkg/crypto/x509/verify_test.go
+++ b/src/pkg/crypto/x509/verify_test.go
@@ -35,7 +35,6 @@ var verifyTests = []verifyTest{
 	\t\tcurrentTime:          1302726541,
 	\t\tdnsName:              "www.google.com",
 	\t\ttestSystemRootsError: true,
-\t\t\tsystemSkip:           true,

 	\t\t// Without any roots specified we should get a system roots
 	\t\t// error.
@@ -214,6 +213,9 @@ func testVerify(t *testing.T, useSystemRoots bool) {
 	\tif useSystemRoots && test.systemSkip {\n \t\t\tcontinue\n \t\t}\n+\t\tif runtime.GOOS == "windows" && test.testSystemRootsError {\n+\t\t\tcontinue\n+\t\t}\n
 	\topts := VerifyOptions{
 	\t\tIntermediates: NewCertPool(),

コアとなるコードの解説

このコミットでは、src/pkg/crypto/x509/verify_test.go ファイル内の testVerify 関数が変更されています。

  1. verifyTests 配列からの systemSkip の削除:

    -		systemSkip:           true,
    

    verifyTests 配列内の特定のテストケースから systemSkip: true の行が削除されました。これは、以前の systemSkip フラグが TestSystemVerify にしか影響せず、TestGoVerify には影響しなかったため、より汎用的なスキップロジックを導入するために不要になったためです。

  2. testVerify 関数内の条件分岐の追加:

    	if runtime.GOOS == "windows" && test.testSystemRootsError {
    		continue
    	}
    

    testVerify 関数内に上記の新しい条件分岐が追加されました。

    • runtime.GOOS == "windows": これは、現在のテストがWindowsオペレーティングシステム上で実行されているかどうかをチェックします。
    • test.testSystemRootsError: これは、現在の verifyTest 構造体(テストケース)が SystemRootsError の発生を期待しているかどうかを示すフラグです。

    この2つの条件が両方とも true の場合、つまり「Windows上で実行されており、かつ SystemRootsError を期待するテストケースである」場合に、continue ステートメントが実行されます。continue はループの現在のイテレーションをスキップし、次のイテレーションに進むため、この特定のテストケースはWindows上では実行されなくなります。

この変更により、Windows環境で SystemRootsError を期待するテストケースが適切にスキップされるようになり、Goの crypto/x509 パッケージがWindowsのCryptoAPIを利用する際の挙動の違いによるテストの失敗が解消されました。

関連リンク

参考にした情報源リンク