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

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

このコミットは、Go言語のcrypto/x509パッケージにおける証明書検証テストの更新に関するものです。具体的には、WindowsオペレーティングシステムがVerisignのルート証明書を削除したことに伴い、Goのテストスイートが影響を受けたため、テストで使用される証明書を更新し、テストが引き続き正しく機能するように修正しています。

コミット

crypto/x509: update tests because Windows removed the Verisign root.

The root update on 3/11/2014 removed the Verisign root cert that the Go
tests use. This only affects the 'TestSystemVerify' test in
crypto/x509.

Fixes #7523.

LGTM=bradfitz
R=golang-codereviews, bradfitz
CC=golang-codereviews
https://golang.org/cl/80000044

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

https://github.com/golang/go/commit/0f272d1378df6a78ce044dc44f8b765c6f191c0f

元コミット内容

commit 0f272d1378df6a78ce044dc44f8b765c6f191c0f
Author: Adam Langley <agl@golang.org>
Date:   Thu Mar 27 17:56:02 2014 -0400

    crypto/x509: update tests because Windows removed the Verisign root.

    The root update on 3/11/2014 removed the Verisign root cert that the Go
    tests use. This only affects the 'TestSystemVerify' test in
    crypto/x509.

    Fixes #7523.

    LGTM=bradfitz
    R=golang-codereviews, bradfitz
    CC=golang-codereviews
    https://golang.org/cl/80000044
---
 src/pkg/crypto/x509/verify_test.go | 213 +++++++++++++++++++++----------------
 1 file changed, 122 insertions(+), 91 deletions(-)

diff --git a/src/pkg/crypto/x509/verify_test.go b/src/pkg/crypto/x509/verify_test.go
index ba6c13d451..75612138f3 100644
--- a/src/pkg/crypto/x509/verify_test.go
+++ b/src/pkg/crypto/x509/verify_test.go
@@ -31,8 +31,8 @@ type verifyTest struct {
 var verifyTests = []verifyTest{
  {
  leaf:                 googleLeaf,
- intermediates:        []string{thawteIntermediate},
- currentTime:          1302726541,
+ intermediates:        []string{giag2Intermediate},
+ currentTime:          1395785200,
  dnsName:              "www.google.com",
  testSystemRootsError: true,
 
@@ -42,39 +42,39 @@ var verifyTests = []verifyTest{
  },
  {
  leaf:          googleLeaf,
- intermediates: []string{thawteIntermediate},
- roots:         []string{verisignRoot},
- currentTime:   1302726541,
+ intermediates: []string{giag2Intermediate},
+ roots:         []string{geoTrustRoot},
+ currentTime:   1395785200,
  dnsName:       "www.google.com",
 
  expectedChains: [][]string{
-   {"Google", "Thawte", "VeriSign"},
+   {"Google", "Google Internet Authority", "GeoTrust"},
  },
  },
  {
  leaf:          googleLeaf,
- intermediates: []string{thawteIntermediate},
- roots:         []string{verisignRoot},
- currentTime:   1302726541,
+ intermediates: []string{giag2Intermediate},
+ roots:         []string{geoTrustRoot},
+ currentTime:   1395785200,
  dnsName:       "WwW.GooGLE.coM",
 
  expectedChains: [][]string{
-   {"Google", "Thawte", "VeriSign"},
+   {"Google", "Google Internet Authority", "GeoTrust"},
  },
  },
  {
  leaf:          googleLeaf,
- intermediates: []string{thawteIntermediate},
- roots:         []string{verisignRoot},
- currentTime:   1302726541,
+ intermediates: []string{giag2Intermediate},
+ roots:         []string{geoTrustRoot},
+ currentTime:   1395785200,
  dnsName:       "www.example.com",
 
  errorCallback: expectHostnameError,
  },
  {
  leaf:          googleLeaf,
- intermediates: []string{thawteIntermediate},
- roots:         []string{verisignRoot},
+ intermediates: []string{giag2Intermediate},
+ roots:         []string{geoTrustRoot},
  currentTime:   1,
  dnsName:       "www.example.com",
 
@@ -82,8 +82,8 @@ var verifyTests = []verifyTest{
  },
  {
  leaf:        googleLeaf,
- roots:       []string{verisignRoot},
- currentTime: 1302726541,
+ roots:       []string{geoTrustRoot},
+ currentTime: 1395785200,
  dnsName:     "www.google.com",
 
  // Skip when using systemVerify, since Windows
@@ -93,13 +93,17 @@ var verifyTests = []verifyTest{
  },
  {
  leaf:          googleLeaf,
- intermediates: []string{verisignRoot, thawteIntermediate},
- roots:         []string{verisignRoot},
- currentTime:   1302726541,
+ intermediates: []string{geoTrustRoot, giag2Intermediate},
+ roots:         []string{geoTrustRoot},
+ currentTime:   1395785200,
  dnsName:       "www.google.com",
 
  expectedChains: [][]string{
-   {"Google", "Thawte", "VeriSign"},
+   {"Google", "Google Internet Authority", "GeoTrust"},
+   // TODO(agl): this is ok, but it would be nice if the
+   //            chain building didn't visit the same SPKI
+   //            twice.
+   {"Google", "Google Internet Authority", "GeoTrust", "GeoTrust"},
  },
  },
  {
@@ -128,9 +132,9 @@ var verifyTests = []verifyTest{
  },
  {
  leaf:          googleLeafWithInvalidHash,
- intermediates: []string{thawteIntermediate},
- roots:         []string{verisignRoot},
- currentTime:   1302726541,
+ intermediates: []string{giag2Intermediate},
+ roots:         []string{geoTrustRoot},
+ currentTime:   1395785200,
  dnsName:       "www.google.com",
 
  // The specific error message may not occur when using system
@@ -385,84 +389,111 @@ func nameToKey(name *pkix.Name) string {
  return strings.Join(name.Country, ",") + "/" + strings.Join(name.Organization, ",") + "/" + strings.Join(name.OrganizationalUnit, ",") + "/" + name.CommonName
  }
  
-const verisignRoot = `-----BEGIN CERTIFICATE-----
-MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG
-A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
-cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
-MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
-BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
-YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
-ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
-BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
-I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
-CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do
-lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc
-AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k
+const geoTrustRoot = `-----BEGIN CERTIFICATE-----
+MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
+MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
+YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
+R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
+9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
+fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
+iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
+1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
+MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
+ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
+uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
+Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
+tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
+PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
+hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
+5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
+-----END CERTIFICATE-----
+`
+
+const giag2Intermediate = `-----BEGIN CERTIFICATE-----
+MIIEBDCCAuygAwIBAgIDAjppMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
+MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
+YWwgQ0EwHhcNMTMwNDA1MTUxNTU1WhcNMTUwNDA0MTUxNTU1WjBJMQswCQYDVQQG
+EwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzElMCMGA1UEAxMcR29vZ2xlIEludGVy
+bmV0IEF1dGhvcml0eSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AJwqBHdc2FCROgajguDYUEi8iT/xGXAaiEZ+4I/F8YnOIe5a/mENtzJEiaB0C1NP
+VaTOgmKV7utZX8bhBYASxF6UP7xbSDj0U/ck5vuR6RXEz/RTDfRK/J9U3n2+oGtv
+h8DQUB8oMANA2ghzUWx//zo8pzcGjr1LEQTrfSTe5vn8MXH7lNVg8y5Kr0LSy+rE
+ahqyzFPdFUuLH8gZYR/Nnag+YyuENWllhMgZxUYi+FOVvuOAShDGKuy6lyARxzmZ
+EASg8GF6lSWMTlJ14rbtCMoU/M4iarNOz0YDl5cDfsCx3nuvRTPPuj5xt970JSXC
+DTWJnZ37DhF5iR43xa+OcmkCAwEAAaOB+zCB+DAfBgNVHSMEGDAWgBTAephojYn7
+qwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUSt0GFhu89mi1dvWBtrtiGrpagS8wEgYD
+VR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwOgYDVR0fBDMwMTAvoC2g
+K4YpaHR0cDovL2NybC5nZXRydXN0LmNvbS9jcmxzL2d0Z2xvYmFsLmNybDA9Bggr
+BgEFBQcBAQEMTAvMC0GCCsGAQUFBzABhiFodHRwOi8vZ3RnbG9iYWwtb2NzcC5n
+ZW90cnVzdC5jb20wFwYDVR0gBBAwDjAMBgorBgEEAdZ5AgUBMA0GCSqGSIb3DQEB
+BQUAA4IBAQA21waAESetKhSbOHezI6B1WLuxfoNCunLaHtiONgaX4PCVOzf9G0JY
+/iLIa704XtE7JW4S615ndkZAkNoUyHgN7ZVm2o6Gb4ChulYylYbc3GrKBIxbf/a/
+zG+FA1jDaFETzf3I93k9mTXwVqO94FntT0QJo544evZG0R0SnU++0ED8Vf4GXjza
+HFa9llF7b1cq26KqltyMdMKVvvBulRP/F/A8rLIQjcxz++iPAsbw+zOzlTvjwsto
+WHPbqCRiOwY1nQ2pM714A5AuTHhdUDqB1O6gyHA43LL5Z/qHQF1hwFGPa4NrzQU6
+yuGnBXj8ytqU0CwIPX4WecigUCAkVDNx
+-----END CERTIFICATE-----
+`
+
+const googleLeaf = `-----BEGIN CERTIFICATE-----
+MIIEdjCCA16gAwIBAgIIcR5k4dkoe04wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE
+BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2dsZSBJbnRl
+cm5ldCBBdXRob3JpdHkgRzIwHhcNMTQwMzEyMDkzODMwWhcNMTQwNjEwMDAwMDAw
+WjBoMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwN
+TW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEXMBUGA1UEAwwOd3d3
+Lmdvb2dsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC4zYCe
+m0oUBhwE0EwBr65eBOcgcQO2PaSIAB2dEP/c1EMX2tOy0ov8rk83ePhJ+MWdT1z6
+jge9X4zQQI8ZyA9qIiwrKBZOi8DNUvrqNZC7fJAVRrb9aX/99uYOJCypIbpmWG1q
+fhbHjJewhwf8xYPj71eU4rLG80a+DapWmphtfq3h52lDQIBzLVf1yYbyrTaELaz4
+NXF7HXb5YkId/gxIsSzM0aFUVu2o8sJcLYAsJqwfFKBKOMxUcn545nlspf0mTcWZ
+0APlbwsKznNs4/xCDwIxxWjjqgHrYAFl6y07i1gzbAOqdNEyR24p+3JWI8WZBlBI
+dk2KGj0W1fIfsvyxAgMBAAGjggFBMIIBPTAdBgNVHSUEFjAUBggrBgEFBQcDAQYI
+KwYBBQUHAwIwGQYDVR0RBBIwEIIOd3d3Lmdvb2dsZS5jb20waAYIKwYBBQUHAQEE
+XDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lBRzIuY3J0
+MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50czEuZ29vZ2xlLmNvbS9vY3NwMB0G
+A1UdDgQWBBTXD5Bx6iqT+dmEhbFL4OUoHyZn8zAMBgNVHRMBAf8EAjAAMB8GA1Ud
+IwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEvMBcGA1UdIAQQMA4wDAYKKwYBBAHW
+eQIFATAwBgNVHR8EKTAnMCWgI6Ahhh9odHRwOi8vcGtpLmdvb2gleS5jb20vR0lB
+RzIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCR3RJtHzgDh33b/MI1ugiki+nl8Ikj
+5larbJRE/rcA5oite+QJyAr6SU1gJJ/rRrK3ItVEHr9L621BCM7GSdoNMjB9MMcf
+tJAW0kYGJ+wqKm53wG/JaOADTnnq2Mt/j6F2uvjgN/ouns1nRHufIvd370N0LeH+
+orKqTuAPzXK7imQk6+OycYABbqCtC/9qmwRd8wwn7sF97DtYfK8WuNHtFalCAwyi
+8LxJJYJCLWoMhZ+V8GZm+FOex5qkQAjnZrtNlbQJ8ro4r+rpKXtmMFFhfa+7L+PA
+Kom08eUK8skxAzfDDijZPh10VtJ66uBoiDPdT+uCBehcBIcmSTrKjFGX
+-----END CERTIFICATE-----
+`

// googleLeafWithInvalidHash is the same as googleLeaf, but the signature
// algorithm in the certificate contains a nonsense OID.
const googleLeafWithInvalidHash = `-----BEGIN CERTIFICATE-----
+MIIEdjCCA16gAwIBAgIIcR5k4dkoe04wDQYJKoZIhvcNAWAFBQAwSTELMAkGA1UE
+BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2dsZSBJbnRl
+cm5ldCBBdXRob3JpdHkgRzIwHhcNMTQwMzEyMDkzODMwWhcNMTQwNjEwMDAwMDAw
+WjBoMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwN
+TW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEXMBUGA1UEAwwOd3d3
+Lmdvb2dsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC4zYCe
+m0oUBhwE0EwBr65eBOcgcQO2PaSIAB2dEP/c1EMX2tOy0ov8rk83ePhJ+MWdT1z6
+jge9X4zQQI8ZyA9qIiwrKBZOi8DNUvrqNZC7fJAVRrb9aX/99uYOJCypIbpmWG1q
+fhbHjJewhwf8xYPj71eU4rLG80a+DapWmphtfq3h52lDQIBzLVf1yYbyrTaELaz4
+NXF7HXb5YkId/gxIsSzM0aFUVu2o8sJcLYAsJqwfFKBKOMxUcn545nlspf0mTcWZ
+0APlbwsKznNs4/xCDwIxxWjjqgHrYAFl6y07i1gzbAOqdNEyR24p+3JWI8WZBlBI
+dk2KGj0W1fIfsvyxAgMBAAGjggFBMIIBPTAdBgNVHSUEFjAUBggrBgEFBQcDAQYI
+KwYBBQUHAwIwGQYDVR0RBBIwEIIOd3d3Lmdvb2dsZS5jb20waAYIKwYBBQUHAQEE
+XDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lBRzIuY3J0
+MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50czEuZ29vZ2xlLmNvbS9vY3NwMB0G
+A1UdDgQWBBTXD5Bx6iqT+dmEhbFL4OUoHyZn8zAMBgNVHRMBAf8EAjAAMB8GA1Ud
+IwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEvMBcGA1UdIAQQMA4wDAYKKwYBBAHW
+eQIFATAwBgNVHR8EKTAnMCWgI6Ahhh9odHRwOi8vcGtpLmdvb2gleS5jb20vR0lB
+RzIuY3JsMA0GCSqGSIb3DQFgBQUAA4IBAQCR3RJtHzgDh33b/MI1ugiki+nl8Ikj
+5larbJRE/rcA5oite+QJyAr6SU1gJJ/rRrK3ItVEHr9L621BCM7GSdoNMjB9MMcf
+tJAW0kYGJ+wqKm53wG/JaOADTnnq2Mt/j6F2uvjgN/ouns1nRHufIvd370N0LeH+
+orKqTuAPzXK7imQk6+OycYABbqCtC/9qmwRd8wwn7sF97DtYfK8WuNHtFalCAwyi
+8LxJJYJCLWoMhZ+V8GZm+FOex5qkQAjnZrtNlbQJ8ro4r+rpKXtmMFFhfa+7L+PA
+Kom08eUK8skxAzfDDijZPh10VtJ66uBoiDPdT+uCBehcBIcmSTrKjFGX
+-----END CERTIFICATE-----
+`
 
 const dnssecExpLeaf = `-----BEGIN CERTIFICATE-----
 MIIGzTCCBbWgAwIBAgIDAdD6MA0GCSqGSIb3DQEBBQUAMIGMMQswCQYDVQQGEwJJ

変更の背景

このコミットは、2014年3月11日にWindowsオペレーティングシステムで行われたルート証明書の更新が原因で発生した問題に対応するために行われました。この更新により、Go言語のcrypto/x509パッケージのテストスイート、特にTestSystemVerifyテストが依存していたVerisignのルート証明書がWindowsの信頼ストアから削除されました。

Goのcrypto/x509パッケージは、システムが提供するルート証明書を利用して証明書の検証を行う機能を持っています。Windowsが特定のルート証明書を信頼しなくなった場合、そのルート証明書に依存するテストは失敗するようになります。このコミットは、テストが再びパスするように、Verisignのルート証明書とそれに関連する中間証明書を、新しく信頼されるGeoTrustのルート証明書とGoogle Internet Authority G2の中間証明書に置き換えることで、この問題を解決しています。

この変更は、Goのテストスイートが外部環境(この場合はOSのルート証明書ストア)の変化に適切に対応する必要があることを示しています。

前提知識の解説

このコミットを理解するためには、以下の概念について理解しておく必要があります。

1. X.509 証明書と公開鍵基盤 (PKI)

X.509証明書は、公開鍵暗号における公開鍵の所有者を認証するための標準的な形式です。インターネット上での安全な通信(TLS/SSLなど)において広く利用されています。証明書には、公開鍵、所有者の情報(ドメイン名、組織名など)、発行者の情報、有効期間、そして発行者のデジタル署名が含まれています。

2. 証明書チェーンと信頼の階層

証明書は通常、単独で信頼されるわけではありません。多くの場合、証明書チェーン(または信頼チェーン)を形成します。

  • ルート証明書 (Root Certificate): チェーンの最上位に位置する自己署名証明書です。これは、オペレーティングシステムやブラウザに事前に組み込まれており、「信頼されたルート証明機関 (CA)」によって発行されます。
  • 中間証明書 (Intermediate Certificate): ルート証明書によって署名された証明書、または別の中間証明書によって署名された証明書です。これにより、ルートCAは直接エンドエンティティ証明書に署名することなく、信頼を委譲できます。
  • エンドエンティティ証明書 (End-entity Certificate / Leaf Certificate): チェーンの最下位に位置する証明書で、ウェブサイトやサーバーなどの具体的なエンティティに発行されます。

証明書の検証プロセスでは、エンドエンティティ証明書から始まり、中間証明書を介して最終的に信頼されたルート証明書に到達するまで、各証明書の署名を検証します。このプロセスが成功すると、その証明書チェーン全体が信頼できると判断されます。

3. ルート証明書ストア

オペレーティングシステム(Windows、macOS、Linuxなど)やウェブブラウザは、信頼できるルート証明書のリストを保持しています。これを「ルート証明書ストア」と呼びます。TLS/SSL接続を確立する際、クライアント(ブラウザやGoアプリケーションなど)は、サーバーから提示された証明書チェーンが、自身のルート証明書ストア内のいずれかのルート証明書に繋がるかどうかを確認します。もし繋がらなければ、その証明書は信頼できないと判断され、接続は拒否されるか、警告が表示されます。

4. Go言語の crypto/x509 パッケージ

Go言語の標準ライブラリに含まれるcrypto/x509パッケージは、X.509証明書の解析、生成、検証機能を提供します。このパッケージは、TLS/SSL通信において証明書の検証を行う際に中心的な役割を果たします。特に、SystemCertPoolなどの機能を通じて、オペレーティングシステムのルート証明書ストアを利用して証明書を検証する能力を持っています。

5. VerisignとGeoTrust

VerisignとGeoTrustは、かつては独立した、あるいは関連する主要な認証局(CA)でした。Verisignはデジタル証明書発行のパイオニアの一つであり、そのルート証明書は広く信頼されていました。しかし、CA業界の再編や買収(例えば、SymantecによるVerisignの認証事業買収、その後のDigiCertへの売却など)により、信頼の階層や証明書のブランドが変化することがあります。このコミットの時期(2014年)には、Windowsが特定のVerisignルート証明書の信頼を停止する、あるいは新しいルート証明書に移行するなどの変更があったと考えられます。GeoTrustもまた、広く信頼されているCAの一つです。

技術的詳細

このコミットの技術的な核心は、Goのcrypto/x509パッケージ内のテストコードが、Windowsのルート証明書ストアの変更にどのように適応したかという点にあります。

Goのcrypto/x509パッケージには、TestSystemVerifyというテスト関数が存在します。このテストは、Goがシステム(この場合はWindows)のルート証明書ストアを利用して証明書チェーンを検証する能力をテストすることを目的としています。テストのシナリオでは、特定のリーフ証明書(googleLeaf)と中間証明書(以前はthawteIntermediate)が与えられ、これらが特定のルート証明書(以前はverisignRoot)によって信頼されることを期待していました。

2014年3月11日のWindowsのルート証明書更新により、TestSystemVerifyが依存していたverisignRootがWindowsの信頼ストアから削除されたか、あるいはその信頼性が変更されました。これにより、GoのテストがWindows上で実行された際に、この特定のテストケースが失敗するようになりました。

このコミットでは、以下の変更を行うことでこの問題を解決しています。

  1. ルート証明書の置き換え: verisignRoot定数に格納されていたVerisignのルート証明書データが、geoTrustRoot定数に格納されたGeoTrustのグローバルルート証明書データに置き換えられました。
  2. 中間証明書の置き換え: thawteIntermediate定数に格納されていたThawteの中間証明書データが、giag2Intermediate定数に格納されたGoogle Internet Authority G2の中間証明書データに置き換えられました。
  3. リーフ証明書の更新: googleLeaf定数に格納されていたGoogleのリーフ証明書も、新しい中間証明書とルート証明書に適合するように更新されました。これは、Googleが使用する証明書チェーンが変更されたことを反映しています。
  4. タイムスタンプの更新: テストケース内で使用されるcurrentTimeの値が、以前の1302726541(2011年4月13日頃)から1395785200(2014年3月25日頃)に更新されました。これは、新しい証明書の有効期間や、テストが実行されるべき現実の時間軸に合わせるためです。
  5. 期待されるチェーンの更新: expectedChains配列内の期待される証明書チェーンの記述が、{"Google", "Thawte", "VeriSign"}から{"Google", "Google Internet Authority", "GeoTrust"}に変更されました。これは、新しい証明書階層を反映しています。

これらの変更により、TestSystemVerifyは、Windowsの新しいルート証明書ストアの状況に合わせて、GeoTrustのルート証明書とGoogle Internet Authority G2の中間証明書を使用して証明書チェーンを正常に検証できるようになりました。

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

変更はすべてsrc/pkg/crypto/x509/verify_test.goファイル内で行われています。

主な変更点は以下の通りです。

  1. verifyTests配列内の各verifyTest構造体において、intermediatesフィールドとrootsフィールドの値が変更されています。

    • thawteIntermediategiag2Intermediateに置き換えられました。
    • verisignRootgeoTrustRootに置き換えられました。
    • currentTime1302726541から1395785200に更新されました。
    • expectedChainsの期待値が新しい証明書チェーンに合わせて更新されました。
  2. ファイル下部で定義されている証明書のPEMエンコードされた文字列定数が更新されました。

    • verisignRoot定数が削除され、その内容が新しいgeoTrustRoot定数として追加されました。
    • thawteIntermediate定数が削除され、その内容が新しいgiag2Intermediate定数として追加されました。
    • googleLeaf定数とgoogleLeafWithInvalidHash定数の内容が更新されました。

コアとなるコードの解説

このコミットの核心は、verify_test.goファイル内のverifyTestsというグローバル変数に定義されているテストケースのデータ構造の変更です。

verifyTestsverifyTest構造体のスライスであり、各verifyTestは特定の証明書検証シナリオを定義します。

type verifyTest struct {
	leaf                 string // リーフ証明書 (PEMエンコード)
	intermediates        []string // 中間証明書 (PEMエンコードの配列)
	roots                []string // ルート証明書 (PEMエンコードの配列)
	currentTime          int64    // 検証時のタイムスタンプ
	dnsName              string   // 検証対象のDNS名
	testSystemRootsError bool     // システムルート検証でエラーを期待するか
	expectedChains       [][]string // 期待される証明書チェーンのパス
	errorCallback        func(error) bool // エラーコールバック
}

このコミットでは、このverifyTest構造体のインスタンス内で参照される証明書データ(leaf, intermediates, roots)と、検証時のタイムスタンプ(currentTime)、そして検証が成功した場合に期待される証明書チェーンの記述(expectedChains)が変更されました。

具体的には、以前はVerisignとThawteの証明書を使用してGoogleの証明書を検証するテストケースが複数存在しましたが、これらがGeoTrustとGoogle Internet Authority G2の証明書を使用するように変更されました。これは、テストが依存する外部の信頼された証明書ストア(Windowsのそれ)が変更されたため、テスト自体もその変更に合わせて更新する必要があったことを意味します。

また、ファイル下部に定義されているPEMエンコードされた証明書文字列定数(verisignRoot, thawteIntermediate, googleLeafなど)が、新しい証明書データに置き換えられています。これらの定数は、テストケース内で証明書データを直接埋め込むために使用されます。

この変更は、Goのcrypto/x509パッケージが、システムが提供するルート証明書を利用して証明書を検証する際に、そのシステムの信頼ストアの変更に柔軟に対応できることを保証するための、重要なメンテナンス作業の一環です。

関連リンク

  • Go Issue #7523 (元のGo issue trackerでの問題、現在はGitHubに移行されている可能性がありますが、直接のリンクは見つかりませんでした): コミットメッセージに記載されている問題番号。
  • Go Gerrit Change 80000044: このコミットのGerritレビューページ。

参考にした情報源リンク

I have generated the detailed explanation in Markdown format, adhering to all the specified sections and requirements. I have used the commit message, the provided diff, and general knowledge about X.509 certificates and PKI to construct the explanation. I also included relevant links. The output is now ready to be printed to standard output.

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

このコミットは、Go言語の`crypto/x509`パッケージにおける証明書検証テストの更新に関するものです。具体的には、WindowsオペレーティングシステムがVerisignのルート証明書を削除したことに伴い、Goのテストスイートが影響を受けたため、テストで使用される証明書を更新し、テストが引き続き正しく機能するように修正しています。

## コミット

crypto/x509: update tests because Windows removed the Verisign root.

The root update on 3/11/2014 removed the Verisign root cert that the Go tests use. This only affects the 'TestSystemVerify' test in crypto/x509.

Fixes #7523.

LGTM=bradfitz R=golang-codereviews, bradfitz CC=golang-codereviews https://golang.org/cl/80000044


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

[https://github.com/golang/go/commit/0f272d1378df6a78ce044dc44f8b765c6f191c0f](https://github.com/golang/go/commit/0f272d1378df6a78ce044dc44f8b765c6f191c0f)

## 元コミット内容

commit 0f272d1378df6a78ce044dc44f8b765c6f191c0f Author: Adam Langley agl@golang.org Date: Thu Mar 27 17:56:02 2014 -0400

crypto/x509: update tests because Windows removed the Verisign root.

The root update on 3/11/2014 removed the Verisign root cert that the Go
tests use. This only affects the 'TestSystemVerify' test in
crypto/x509.

Fixes #7523.

LGTM=bradfitz
R=golang-codereviews, bradfitz
CC=golang-codereviews
https://golang.org/cl/80000044

src/pkg/crypto/x509/verify_test.go | 213 +++++++++++++++++++++---------------- 1 file changed, 122 insertions(+), 91 deletions(-)\n diff --git a/src/pkg/crypto/x509/verify_test.go b/src/pkg/crypto/x509/verify_test.go index ba6c13d451..75612138f3 100644 --- a/src/pkg/crypto/x509/verify_test.go +++ b/src/pkg/crypto/x509/verify_test.go @@ -31,8 +31,8 @@ type verifyTest struct { var verifyTests = []verifyTest{ { leaf: googleLeaf,

  • intermediates: []string{thawteIntermediate},
  • currentTime: 1302726541,
  • intermediates: []string{giag2Intermediate},
  • currentTime: 1395785200, dnsName: "www.google.com", testSystemRootsError: true,

@@ -42,39 +42,39 @@ var verifyTests = []verifyTest{ }, { leaf: googleLeaf,

  • intermediates: []string{thawteIntermediate},
  • roots: []string{verisignRoot},
  • currentTime: 1302726541,
  • intermediates: []string{giag2Intermediate},

  • roots: []string{geoTrustRoot},

  • currentTime: 1395785200, dnsName: "www.google.com",

    expectedChains: [][]string{

  • {"Google", "Thawte", "VeriSign"},
  • {"Google", "Google Internet Authority", "GeoTrust"}, }, }, { leaf: googleLeaf,
  • intermediates: []string{thawteIntermediate},
  • roots: []string{verisignRoot},
  • currentTime: 1302726541,
  • intermediates: []string{giag2Intermediate},

  • roots: []string{geoTrustRoot},

  • currentTime: 1395785200, dnsName: "WwW.GooGLE.coM",

    expectedChains: [][]string{

  • {"Google", "Thawte", "VeriSign"},
  • {"Google", "Google Internet Authority", "GeoTrust"}, }, }, { leaf: googleLeaf,
  • intermediates: []string{thawteIntermediate},
  • roots: []string{verisignRoot},
  • currentTime: 1302726541,
  • intermediates: []string{giag2Intermediate},

  • roots: []string{geoTrustRoot},

  • currentTime: 1395785200, dnsName: "www.example.com",

    errorCallback: expectHostnameError, }, { leaf: googleLeaf,

  • intermediates: []string{thawteIntermediate},
  • roots: []string{verisignRoot},
  • intermediates: []string{giag2Intermediate},
  • roots: []string{geoTrustRoot}, currentTime: 1, dnsName: "www.example.com",

@@ -82,8 +82,8 @@ var verifyTests = []verifyTest{ }, { leaf: googleLeaf,

  • roots: []string{verisignRoot},
  • currentTime: 1302726541,
  • roots: []string{geoTrustRoot},

  • currentTime: 1395785200, dnsName: "www.google.com",

    // Skip when using systemVerify, since Windows @@ -93,13 +93,17 @@ var verifyTests = []verifyTest{ }, { leaf: googleLeaf,

  • intermediates: []string{verisignRoot, thawteIntermediate},
  • roots: []string{verisignRoot},
  • currentTime: 1302726541,
  • intermediates: []string{geoTrustRoot, giag2Intermediate},

  • roots: []string{geoTrustRoot},

  • currentTime: 1395785200, dnsName: "www.google.com",

    expectedChains: [][]string{

  • {"Google", "Thawte", "VeriSign"},
  • {"Google", "Google Internet Authority", "GeoTrust"},
  • // TODO(agl): this is ok, but it would be nice if the
  • // chain building didn't visit the same SPKI
  • // twice.
  • {"Google", "Google Internet Authority", "GeoTrust", "GeoTrust"}, }, }, { @@ -128,9 +132,9 @@ var verifyTests = []verifyTest{ }, { leaf: googleLeafWithInvalidHash,
  • intermediates: []string{thawteIntermediate},
  • roots: []string{verisignRoot},
  • currentTime: 1302726541,
  • intermediates: []string{giag2Intermediate},

  • roots: []string{geoTrustRoot},

  • currentTime: 1395785200, dnsName: "www.google.com",

    // The specific error message may not occur when using system @@ -385,84 +389,111 @@ func nameToKey(name *pkix.Name) string { return strings.Join(name.Country, ",") + "/" + strings.Join(name.Organization, ",") + "/" + strings.Join(name.OrganizationalUnit, ",") + "/" + name.CommonName }

-const verisignRoot = -----BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYgA1UECxMyLkNs -YXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcN -OTYwMTI5MDAwMDAwWhcNMTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAV -BgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQ -cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA -4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3Kq -hEBarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/i -sI19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do -lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc -AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k +const geoTrustRoot = -----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1QQChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- ++ +const giag2Intermediate =-----BEGIN CERTIFICATE----- +MIIEBDCCAuygAwIBAgIDAjppMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMTMwNDA1MTUxNTU1WhcNMTUwNDA0MTUxNTU1WjBJMQswCQYDVQQG +EwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzElMCMGA1UEAxMcR29vZ2xlIEludGVy +bmV0IEF1dGhvcml0eSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AJwqBHdc2FCROgajguDYUEi8iT/xGXAaiEZ+4I/F8YnOIe5a/mENtzJEiaB0C1NP +VaTOgmKV7utZX8bhBYASxF6UP7xbSDj0U/ck5vuR6RXEz/RTDfRK/J9U3n2+oGtv +h8DQUB8oMANA2ghzUWx//zo8pzcGjr1LEQTrfSTe5vn8MXH7lNVg8y5Kr0LSy+rE +ahqyzFPdFUuLH8gZYR/Nnag+YyuENWllhMgZxUYi+FOVvuOAShDGKuy6lyARxzmZ +EASg8GF6lSWMTlJ14rbtCMoU/M4iarNOz0YDl5cDfsCx3nuvRTPPuj5xt970JSXC +DTWJnZ37DhF5iR43xa+OcmkCAwEAAaOB+zCB+DAfBgNVHSMEGDAWgBTAephojYn7 +qwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUSt0GFhu89mi1dvWBtrtiGrpagS8wEgYD +VR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwOgYDVR0fBDMwMTAvoC2g +K4YpaHR0cDovL2NybC5nZXRydXN0LmNvbS9jcmxzL2d0Z2xvYmFsLmNybDA9Bggr +BgEFBQcBAQEMTAvMC0GCCsGAQUFBzABhiFodHRwOi8vZ3RnbG9iYWwtb2NzcC5n +ZW90cnVzdC5jb20wFwYDVR0gBBAwDjAMBgorBgEEAdZ5AgUBMA0GCSqGSIb3DQEB +BQUAA4IBAQA21waAESetKhSbOHezI6B1WLuxfoNCunLaHtiONgaX4PCVOzf9G0JY +/iLIa704XtE7JW4S615ndkZAkNoUyHgN7ZVm2o6Gb4ChulYylYbc3GrKBIxbf/a/ +zG+FA1jDaFETzf3I93k9mTXwVqO94FntT0QJo544evZG0R0SnU++0ED8Vf4GXjza +HFa9llF7b1cq26KqltyMdMKVvvBulRP/F/A8rLIQjcxz++iPAsbw+zOzlTvjwsto +WHPbqCRiOwY1nQ2pM714A5AuTHhdUDqB1O6gyHA43LL5Z/qHQF1hwFGPa4NrzQU6 +yuGnBXj8ytqU0CwIPX4WecigUCAkVDNx +-----END CERTIFICATE----- ++ +const googleLeaf =-----BEGIN CERTIFICATE----- +MIIEdjCCA16gAwIBAgIIcR5k4dkoe04wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE +BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2dsZSBJbnRl +cm5ldCBBdXRob3JpdHkgRzIwHhcNMTQwMzEyMDkzODMwWhcNMTQwNjEwMDAwMDAw +WjBoMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwN +TW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEXMBUGA1UEAwwOd3d3 +Lmdvb2dsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC4zYCe +m0oUBhwE0EwBr65eBOcgcQO2PaSIAB2dEP/c1EMX2tOy0ov8rk83ePhJ+MWdT1z6 +jge9X4zQQI8ZyA9qIiwrKBZOi8DNUvrqNZC7fJAVRrb9aX/99uYOJCypIbpmWG1q +fhbHjJewhwf8xYPj71eU4rLG80a+DapWmphtfq3h52lDQIBzLVf1yYbyrTaELaz4 +NXF7HXb5YkId/gxIsSzM0aFUVu2o8sJcLYAsJqwfFKBKOMxUcn545nlspf0mTcWZ +0APlbwsKznNs4/xCDwIxxWjjqgHrYAFl6y07i1gzbAOqdNEyR24p+3JWI8WZBlBI +dk2KGj0W1fIfsvyxAgMBAAGjggFBMIIBPTAdBgNVHSUEFjAUBggrBgEFBQcDAQYI +KwYBBQUHAwIwGQYDVR0RBBIwEIIOd3d3Lmdvb2dsZS5jb20waAYIKwYBBQUHAQEE +XDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtpL2dvb2dsZS5jb20vR0lBRzIuY3J0 +MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50czEuZ29vZ2xlLmNvbS9vY3NwMB0G +A1UdDgQWBBTXD5Bx6iqT+dmEhbFL4OUoHyZn8zAMBgNVHRMBAf8EAjAAMB8GA1Ud +IwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEvMBcGA1UdIAQQMA4wDAYKKwYBBAHW +eQIFATAwBgNVHR8EKTAnMCWgI6Ahhh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lB +RzIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCR3RJtHzgDh33b/MI1ugiki+nl8Ikj +5larbJRE/rcA5oite+QJyAr6SU1gJJ/rRrK3ItVEHr9L621BCM7GSdoNMjB9MMcf +tJAW0kYGJ+wqKm53wG/JaOADTnnq2Mt/j6F2uvjgN/ouns1nRHufIvd370N0LeH+ +orKqTuAPzXK7imQk6+OycYABbqCtC/9qmwRd8wwn7sF97DtYfK8WuNHtFalCAwyi +8LxJJYJCLWoMhZ+V8GZm+FOex5qkQAjnZrtNlbQJ8ro4r+rpKXtmMFFhfa+7L+PA +Kom08eUK8skxAzfDDijZPh10VtJ66uBoiDPdT+uCBehcBIcmSTrKjFGX +-----END CERTIFICATE----- +`

// googleLeafWithInvalidHash is the same as googleLeaf, but the signature // algorithm in the certificate contains a nonsense OID. const googleLeafWithInvalidHash = -----BEGIN CERTIFICATE----- +MIIEdjCCA16gAwIBAgIIcR5k4dkoe04wDQYJKoZIhvcNAWAFBQAwSTELMAkGA1UE +BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2dsZSBJbnRl +cm5ldCBBdXRob3JpdHkgRzIwHhcNMTQwMzEyMDkzODMwWhcNMTQwNjEwMDAwMDAw +WjBoMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwN +TW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEXMBUGA1UEAwwOd3d3 +Lmdvb2dsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC4zYCe +m0oUBhwE0EwBr65eBOcgcQO2PaSIAB2dEP/c1EMX2tOy0ov8rk83ePhJ+MWdT1z6 +jge9X4zQQI8ZyA9qIiwrKBZOi8DNUvrqNZC7fJAVRrb9aX/99uYOJCypIbpmWG1q +fhbHjJewhwf8xYPj71eU4rLG80a+DapWmphtfq3h52lDQIBzLVf1yYbyrTaELaz4 +NXF7HXb5YkId/gxIsSzM0aFUVu2o8sJcLYAsJqwfFKBKOMxUcn545nlspf0mTcWZ +0APlbwsKznNs4/xCDwIxxWjjqgHrYAFl6y07i1gzbAOqdNEyR24p+3JWI8WZBlBI +dk2KGj0W1fIfsvyxAgMBAAGjggFBMIIBPTAdBgNVHSUEFjAUBggrBgEFBQcDAQYI +KwYBBQUHAwIwGQYDVR0RBBIwEIIOd3d3Lmdvb2dsZS5jb20waAYIKwYBBQUHAQEE +XDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lBRzIuY3J0 +MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50czEuZ29vZ2xlLmNvbS9vY3NwMB0G +A1UdDgQWBBTXD5Bx6iqT+dmEhbFL4OUoHyZn8zAMBgNVHRMBAf8EAjAAMB8GA1Ud +IwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEvMBcGA1UdIAQQMA4wDAYKKwYBBAHW +eQIFATAwBgNVHR8EKTAnMCWgI6Ahhh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lB +RzIuY3JsMA0GCSqGSIb3DQFgBQUAA4IBAQCR3RJtHzgDh33b/MI1ugiki+nl8Ikj +5larbJRE/rcA5oite+QJyAr6SU1gJJ/rRrK3ItVEHr9L621BCM7GSdoNMjB9MMcf +tJAW0kYGJ+wqKm53wG/JaOADTnnq2Mt/j6F2uvjgN/ouns1nRHufIvd370N0LeH+ +orKqTuAPzXK7imQk6+OycYABbqCtC/9qmwRd8wwn7sF97DtYfK8WuNHtFalCAwyi +8LxJJYJCLWoMhZ+V8GZm+FOex5qkQAjnZrtNlbQJ8ro4r+rpKXtmMFFhfa+7L+PA +Kom08eUK8skxAzfDDijZPh10VtJ66uBoiDPdT+uCBehcBIcmSTrKjFGX +-----END CERTIFICATE----- +

const dnssecExpLeaf = `-----BEGIN CERTIFICATE----- MIIGzTCCBbWgAwIBAgIDAdD6MA0GCSqGSIb3DQEBBQUAMIGMMQswCQYDVQQGEwJJ


## 変更の背景

このコミットは、2014年3月11日にWindowsオペレーティングシステムで行われたルート証明書の更新が原因で発生した問題に対応するために行われました。この更新により、Go言語の`crypto/x509`パッケージのテストスイート、特に`TestSystemVerify`テストが依存していたVerisignのルート証明書がWindowsの信頼ストアから削除されました。

Goの`crypto/x509`パッケージは、システムが提供するルート証明書を利用して証明書の検証を行う機能を持っています。Windowsが特定のルート証明書を信頼しなくなった場合、そのルート証明書に依存するテストは失敗するようになります。このコミットは、テストが再びパスするように、Verisignのルート証明書とそれに関連する中間証明書を、新しく信頼されるGeoTrustのルート証明書とGoogle Internet Authority G2の中間証明書に置き換えることで、この問題を解決しています。

この変更は、Goのテストスイートが外部環境(この場合はOSのルート証明書ストア)の変化に適切に対応する必要があることを示しています。

## 前提知識の解説

このコミットを理解するためには、以下の概念について理解しておく必要があります。

### 1. X.509 証明書と公開鍵基盤 (PKI)

X.509証明書は、公開鍵暗号における公開鍵の所有者を認証するための標準的な形式です。インターネット上での安全な通信(TLS/SSLなど)において広く利用されています。証明書には、公開鍵、所有者の情報(ドメイン名、組織名など)、発行者の情報、有効期間、そして発行者のデジタル署名が含まれています。

### 2. 証明書チェーンと信頼の階層

証明書は通常、単独で信頼されるわけではありません。多くの場合、**証明書チェーン**(または信頼チェーン)を形成します。
*   **ルート証明書 (Root Certificate)**: チェーンの最上位に位置する自己署名証明書です。これは、オペレーティングシステムやブラウザに事前に組み込まれており、「信頼されたルート証明機関 (CA)」によって発行されます。
*   **中間証明書 (Intermediate Certificate)**: ルート証明書によって署名された証明書、または別の中間証明書によって署名された証明書です。これにより、ルートCAは直接エンドエンティティ証明書に署名することなく、信頼を委譲できます。
*   **エンドエンティティ証明書 (End-entity Certificate / Leaf Certificate)**: チェーンの最下位に位置する証明書で、ウェブサイトやサーバーなどの具体的なエンティティに発行されます。

証明書の検証プロセスでは、エンドエンティティ証明書から始まり、中間証明書を介して最終的に信頼されたルート証明書に到達するまで、各証明書の署名を検証します。このプロセスが成功すると、その証明書チェーン全体が信頼できると判断されます。

### 3. ルート証明書ストア

オペレーティングシステム(Windows、macOS、Linuxなど)やウェブブラウザは、信頼できるルート証明書のリストを保持しています。これを「ルート証明書ストア」と呼びます。TLS/SSL接続を確立する際、クライアント(ブラウザやGoアプリケーションなど)は、サーバーから提示された証明書チェーンが、自身のルート証明書ストア内のいずれかのルート証明書に繋がるかどうかを確認します。もし繋がらなければ、その証明書は信頼できないと判断され、接続は拒否されるか、警告が表示されます。

### 4. Go言語の `crypto/x509` パッケージ

Go言語の標準ライブラリに含まれる`crypto/x509`パッケージは、X.509証明書の解析、生成、検証機能を提供します。このパッケージは、TLS/SSL通信において証明書の検証を行う際に中心的な役割を果たします。特に、`SystemCertPool`などの機能を通じて、オペレーティングシステムのルート証明書ストアを利用して証明書を検証する能力を持っています。

### 5. VerisignとGeoTrust

VerisignとGeoTrustは、かつては独立した、あるいは関連する主要な認証局(CA)でした。Verisignはデジタル証明書発行のパイオニアの一つであり、そのルート証明書は広く信頼されていました。しかし、CA業界の再編や買収(例えば、SymantecによるVerisignの認証事業買収、その後のDigiCertへの売却など)により、信頼の階層や証明書のブランドが変化することがあります。このコミットの時期(2014年)には、Windowsが特定のVerisignルート証明書の信頼を停止する、あるいは新しいルート証明書に移行するなどの変更があったと考えられます。GeoTrustもまた、広く信頼されているCAの一つです。

## 技術的詳細

このコミットの技術的な核心は、Goの`crypto/x509`パッケージ内のテストコードが、Windowsのルート証明書ストアの変更にどのように適応したかという点にあります。

Goの`crypto/x509`パッケージには、`TestSystemVerify`というテスト関数が存在します。このテストは、Goがシステム(この場合はWindows)のルート証明書ストアを利用して証明書チェーンを検証する能力をテストすることを目的としています。テストのシナリオでは、特定のリーフ証明書(`googleLeaf`)と中間証明書(以前は`thawteIntermediate`)が与えられ、これらが特定のルート証明書(以前は`verisignRoot`)によって信頼されることを期待していました。

2014年3月11日のWindowsのルート証明書更新により、`TestSystemVerify`が依存していた`verisignRoot`がWindowsの信頼ストアから削除されたか、あるいはその信頼性が変更されました。これにより、GoのテストがWindows上で実行された際に、この特定のテストケースが失敗するようになりました。

このコミットでは、以下の変更を行うことでこの問題を解決しています。

1.  **ルート証明書の置き換え**: `verisignRoot`定数に格納されていたVerisignのルート証明書データが、`geoTrustRoot`定数に格納されたGeoTrustのグローバルルート証明書データに置き換えられました。
2.  **中間証明書の置き換え**: `thawteIntermediate`定数に格納されていたThawteの中間証明書データが、`giag2Intermediate`定数に格納されたGoogle Internet Authority G2の中間証明書データに置き換えられました。
3.  **リーフ証明書の更新**: `googleLeaf`定数に格納されていたGoogleのリーフ証明書も、新しい中間証明書とルート証明書に適合するように更新されました。これは、Googleが使用する証明書チェーンが変更されたことを反映しています。
4.  **タイムスタンプの更新**: テストケース内で使用される`currentTime`の値が、以前の`1302726541`(2011年4月13日頃)から`1395785200`(2014年3月25日頃)に更新されました。これは、新しい証明書の有効期間や、テストが実行されるべき現実の時間軸に合わせるためです。
5.  **期待されるチェーンの更新**: `expectedChains`配列内の期待される証明書チェーンの記述が、`{"Google", "Thawte", "VeriSign"}`から`{"Google", "Google Internet Authority", "GeoTrust"}`に変更されました。これは、新しい証明書階層を反映しています。

これらの変更により、`TestSystemVerify`は、Windowsの新しいルート証明書ストアの状況に合わせて、GeoTrustのルート証明書とGoogle Internet Authority G2の中間証明書を使用して証明書チェーンを正常に検証できるようになりました。

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

変更はすべて`src/pkg/crypto/x509/verify_test.go`ファイル内で行われています。

主な変更点は以下の通りです。

1.  `verifyTests`配列内の各`verifyTest`構造体において、`intermediates`フィールドと`roots`フィールドの値が変更されています。
    *   `thawteIntermediate`が`giag2Intermediate`に置き換えられました。
    *   `verisignRoot`が`geoTrustRoot`に置き換えられました。
    *   `currentTime`が`1302726541`から`1395785200`に更新されました。
    *   `expectedChains`の期待値が新しい証明書チェーンに合わせて更新されました。

2.  ファイル下部で定義されている証明書のPEMエンコードされた文字列定数が更新されました。
    *   `verisignRoot`定数が削除され、その内容が新しい`geoTrustRoot`定数として追加されました。
    *   `thawteIntermediate`定数が削除され、その内容が新しい`giag2Intermediate`定数として追加されました。
    *   `googleLeaf`定数と`googleLeafWithInvalidHash`定数の内容が更新されました。

## コアとなるコードの解説

このコミットの核心は、`verify_test.go`ファイル内の`verifyTests`というグローバル変数に定義されているテストケースのデータ構造の変更です。

`verifyTests`は`verifyTest`構造体のスライスであり、各`verifyTest`は特定の証明書検証シナリオを定義します。

```go
type verifyTest struct {
	leaf                 string // リーフ証明書 (PEMエンコード)
	intermediates        []string // 中間証明書 (PEMエンコードの配列)
	roots                []string // ルート証明書 (PEMエンコードの配列)
	currentTime          int64    // 検証時のタイムスタンプ
	dnsName              string   // 検証対象のDNS名
	testSystemRootsError bool     // システムルート検証でエラーを期待するか
	expectedChains       [][]string // 期待される証明書チェーンのパス
	errorCallback        func(error) bool // エラーコールバック
}

このコミットでは、このverifyTest構造体のインスタンス内で参照される証明書データ(leaf, intermediates, roots)と、検証時のタイムスタンプ(currentTime)、そして検証が成功した場合に期待される証明書チェーンの記述(expectedChains)が変更されました。

具体的には、以前はVerisignとThawteの証明書を使用してGoogleの証明書を検証するテストケースが複数存在しましたが、これらがGeoTrustとGoogle Internet Authority G2の証明書を使用するように変更されました。これは、テストが依存する外部の信頼された証明書ストア(Windowsのそれ)が変更されたため、テスト自体もその変更に合わせて更新する必要があったことを意味します。

また、ファイル下部に定義されているPEMエンコードされた証明書文字列定数(verisignRoot, thawteIntermediate, googleLeafなど)が、新しい証明書データに置き換えられています。これらの定数は、テストケース内で証明書データを直接埋め込むために使用されます。

この変更は、Goのcrypto/x509パッケージが、システムが提供するルート証明書を利用して証明書を検証する際に、そのシステムの信頼ストアの変更に柔軟に対応できることを保証するための、重要なメンテナンス作業の一環です。

関連リンク

  • Go Issue #7523 (元のGo issue trackerでの問題、現在はGitHubに移行されている可能性がありますが、直接のリンクは見つかりませんでした): コミットメッセージに記載されている問題番号。
  • Go Gerrit Change 80000044: このコミットのGerritレビューページ。

参考にした情報源リンク