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

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

このコミットは、Go言語の標準ライブラリ crypto/x509 パッケージにおいて、SHA-512ハッシュアルゴリズムのサポートをデフォルトで有効にする変更を導入しています。具体的には、SHA-384で署名された中間証明書への対応を強化し、関連するテストケースを追加しています。

コミット

commit b53bb2cae512ce4abbc1587a903171a9da6201cf
Author: Adam Langley <agl@golang.org>
Date:   Mon Apr 14 12:12:06 2014 -0700

    crypto/x509: support SHA-512 by default.
    
    Comodo are now using a SHA-384 signed intermediate. The crypto/x509
    package seeks to import hash functions needed for typical operation
    without needing to import every hash function possible. Since a SHA-384
    certificate is being used by Comodo, crypto/sha512 now appears to fall
    into the scope of "typical operation".
    
    R=bradfitz
    
    LGTM=bradfitz
    R=golang-codereviews, bradfitz
    CC=golang-codereviews
    https://golang.org/cl/87670045

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

https://github.com/golang/go/commit/b53bb2cae512ce4abbc1587a903171a9da6201cf

元コミット内容

crypto/x509: support SHA-512 by default.

ComodoがSHA-384で署名された中間証明書を使用し始めたため、crypto/x509 パッケージは通常の運用に必要なハッシュ関数を、可能なすべてのハッシュ関数をインポートすることなく取り込むことを目指しています。ComodoによってSHA-384証明書が使用されているため、crypto/sha512 は「通常の運用」の範囲に含まれるようになりました。

変更の背景

この変更の主な背景は、大手認証局であるComodo(現在のSectigo)が、SHA-384ハッシュアルゴリズムで署名された中間証明書を発行し始めたことにあります。

SSL/TLS証明書の検証プロセスでは、証明書チェーン(エンドエンティティ証明書、中間証明書、ルート証明書)を検証する必要があります。各証明書は、その上位の証明書によって署名されており、その署名の検証には適切なハッシュアルゴリズムと公開鍵が必要です。

Goの crypto/x509 パッケージは、効率性とセキュリティのバランスを取るため、必要最小限のハッシュ関数のみをデフォルトでインポートする設計思想を持っていました。しかし、Comodoのような広く利用されている認証局がSHA-384を使用し始めたことで、SHA-384のサポートが「通常の運用」において不可欠なものとなりました。

SHA-384はSHA-2ファミリーに属するハッシュ関数であり、SHA-512をベースにしていますが、出力サイズが異なります(SHA-384は384ビット、SHA-512は512ビット)。Goの crypto/sha512 パッケージは、SHA-384とSHA-512の両方の実装を含んでいます。したがって、SHA-384をサポートするためには、crypto/sha512 パッケージをインポートする必要がありました。

この変更は、GoアプリケーションがComodoによって発行されたSHA-384署名証明書を正しく検証できるようにし、相互運用性を確保することを目的としています。

前提知識の解説

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

X.509は、公開鍵証明書の標準フォーマットです。SSL/TLS通信において、サーバーやクライアントの身元を証明するために広く使用されています。X.509証明書は、公開鍵、所有者の識別情報、発行者の識別情報、有効期間、署名アルゴリズム、発行者の署名などの情報を含みます。

証明書チェーン: 信頼の連鎖を確立するために、複数の証明書が連結されたものです。

  • エンドエンティティ証明書(リーフ証明書): サーバーやクライアント自身に発行される証明書。
  • 中間証明書: エンドエンティティ証明書を署名し、ルート証明書に連結する役割を持つ証明書。多くの場合、セキュリティ上の理由から、ルート証明書はオフラインで厳重に管理され、中間証明書が日常的な署名に使用されます。
  • ルート証明書: 自己署名された証明書で、信頼の起点となります。オペレーティングシステムやブラウザに事前にインストールされており、「信頼されたルート証明書」として扱われます。

証明書の検証は、リーフ証明書から始まり、中間証明書を介してルート証明書に至るまで、各証明書の署名が上位の証明書によって正しく行われているかを確認するプロセスです。

2. ハッシュ関数とデジタル署名

ハッシュ関数: 任意の長さの入力データから、固定長の短いデータ(ハッシュ値、メッセージダイジェスト)を生成する一方向関数です。入力が少しでも変わると、出力されるハッシュ値は大きく変化します。データの完全性(改ざんされていないこと)を確認するために使用されます。

デジタル署名: 公開鍵暗号技術を用いて、データの作成者の身元を証明し、データの改ざんを検出する仕組みです。

  1. 署名者は、元のデータからハッシュ値を計算します。
  2. そのハッシュ値を自身の秘密鍵で暗号化(署名)します。
  3. 署名されたハッシュ値と元のデータを送ります。
  4. 検証者は、元のデータからハッシュ値を再計算します。
  5. 署名者の公開鍵を使って、受け取った署名を復号し、元のハッシュ値を取得します。
  6. 両方のハッシュ値が一致すれば、データは改ざんされておらず、署名者が作成したものであると確認できます。

3. SHA-2 ファミリー (SHA-256, SHA-384, SHA-512)

SHA-2 (Secure Hash Algorithm 2) は、NIST(アメリカ国立標準技術研究所)によって開発された暗号学的ハッシュ関数のファミリーです。SHA-1の後継として設計され、より高いセキュリティレベルを提供します。

  • SHA-256: 256ビットのハッシュ値を生成します。
  • SHA-512: 512ビットのハッシュ値を生成します。
  • SHA-384: SHA-512をベースにしていますが、出力サイズが384ビットに切り詰められています。内部的にはSHA-512と同じアルゴリズムを使用し、初期値と出力の切り詰め方が異なります。

SHA-1は2014年頃から衝突攻撃の可能性が指摘され始め、より強力なSHA-2への移行が推奨されていました。このコミットが行われた2014年という時期は、まさにその移行期にあたります。

4. Go言語の crypto パッケージの設計思想

Go言語の crypto パッケージ群は、セキュリティとパフォーマンスを考慮して設計されています。特にハッシュ関数に関しては、すべての可能なハッシュ関数を常にメモリにロードするのではなく、必要に応じてインポートすることで、バイナリサイズとメモリ使用量を最適化しようとする傾向があります。

Goでは、_ "package/path" の形式でパッケージをインポートすると、そのパッケージの init() 関数が実行されますが、パッケージ内のエクスポートされた識別子を直接使用することはありません。これは、パッケージが提供する副作用(この場合は、ハッシュアルゴリズムの登録)を利用したい場合に用いられるイディオムです。crypto/x509 パッケージは、証明書の署名検証時に利用可能なハッシュアルゴリズムを内部的に検索するため、crypto/sha512 パッケージがインポートされることで、SHA-384およびSHA-512アルゴリズムが x509 パッケージから利用可能になります。

技術的詳細

このコミットの技術的な核心は、Goの crypto/x509 パッケージが、証明書の署名検証時にSHA-384ハッシュアルゴリズムを認識し、利用できるようにすることです。

crypto/x509 パッケージは、証明書の署名アルゴリズムを識別し、それに対応するハッシュ関数と公開鍵アルゴリズムを使用して署名を検証します。以前は、SHA-384が「通常の運用」の範囲外と見なされていたため、crypto/sha512 パッケージ(SHA-384の実装を含む)はデフォルトでインポートされていませんでした。

ComodoがSHA-384署名の中間証明書を発行し始めたことで、Goアプリケーションがこれらの証明書を検証できなくなる問題が発生しました。この問題を解決するため、crypto/x509 パッケージの x509.go ファイルに _ "crypto/sha512" というブランクインポートが追加されました。

このブランクインポートにより、crypto/sha512 パッケージの init() 関数が実行されます。crypto/sha512 パッケージの init() 関数は、SHA-384とSHA-512のハッシュアルゴリズムをGoの暗号ライブラリのグローバルなハッシュ関数レジストリに登録します。これにより、crypto/x509 パッケージが証明書の署名アルゴリズムを解析した際に、SHA-384に対応するハッシュ関数をこのレジストリから見つけ出し、署名検証に使用できるようになります。

また、verify_test.go には、ComodoのSHA-384中間証明書とMoipのリーフ証明書を含む新しいテストケースが追加されました。このテストケースは、SHA-384で署名された中間証明書を含む証明書チェーンが正しく検証されることを確認します。テストデータには、実際の証明書のPEMエンコードされたデータが含まれており、これにより実際のシナリオに近い検証が可能になります。

この変更は、Goの crypto/x509 パッケージの堅牢性と相互運用性を向上させ、最新の証明書発行プラクティスに対応するための重要なステップでした。

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

このコミットによる主要なコード変更は以下の2つのファイルにあります。

  1. src/pkg/crypto/x509/x509.go

    • _ "crypto/sha512" のブランクインポートが追加されました。
    --- a/src/pkg/crypto/x509/x509.go
    +++ b/src/pkg/crypto/x509/x509.go
    @@ -14,6 +14,7 @@ import (
     	"crypto/rsa"
     	"crypto/sha1"
     	_ "crypto/sha256"
    +_	"crypto/sha512"
     	"crypto/x509/pkix"
     	"encoding/asn1"
     	"encoding/pem"
    
  2. src/pkg/crypto/x509/verify_test.go

    • SHA-384中間証明書を検証するための新しいテストケース verifyTestverifyTests スライスに追加されました。
    • テストに使用される証明書データ(moipLeafCert, comodoIntermediateSHA384, comodoRSARoot)が追加されました。
    --- a/src/pkg/crypto/x509/verify_test.go
    +++ b/src/pkg/crypto/x509/verify_test.go
    @@ -209,6 +209,23 @@ var verifyTests = []verifyTest{
     			},
     		},
     	},
    +	{
    +		// Check that SHA-384 intermediates (which are popping up)
    +		// work.
    +		leaf:          moipLeafCert,
    +		intermediates: []string{comodoIntermediateSHA384},
    +		roots:         []string{comodoRSARoot},
    +		currentTime:   1397502195,
    +		dnsName:       "api.moip.com.br",
    +
    +		expectedChains: [][]string{
    +			{
    +				"api.moip.com.br",
    +				"COMODO RSA Extended Validation Secure Server CA",
    +				"COMODO RSA Certification Authority",
    +			},
    +		},
    +	},
     }
     
     func expectHostnameError(t *testing.T, i int, err error) (ok bool) {
    @@ -971,3 +988,109 @@ AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
     DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
     HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
     -----END CERTIFICATE-----`
    +
    +var moipLeafCert = `-----BEGIN CERTIFICATE-----
    +MIIGQDCCBSigAwIBAgIRAPe/cwh7CUWizo8mYSDavLIwDQYJKoZIhvcNAQELBQAw
    +gZIxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
    +BgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMTgwNgYD
    +VQQDEy9DT01PRE8gUlNBIEV4dGVuZGVkIFZhbGlkYXRpb24gU2VjdXJlIFNlcnZl
    +ciBDQTAeFw0xMzA4MTUwMDAwMDBaFw0xNDA4MTUyMzU5NTlaMIIBQjEXMBUGA1UE
    +BRMOMDg3MTg0MzEwMDAxMDgxEzARBgsrBgEEAYI3PAIBAxMCQlIxGjAYBgsrBgEE
    +AYI3PAIBAhMJU2FvIFBhdWxvMR0wGwYDVQQPExRQcml2YXRlIE9yZ2FuaXphdGlv
    +bjELMAkGA1UEBhMCQlIxETAPBgNVBBETCDAxNDUyMDAwMRIwEAYDVQQIEwlTYW8g
    +UGF1bG8xEjAQBgNVBAcTCVNhbyBQYXVsbzEtMCsGA1UECRMkQXZlbmlkYSBCcmln
    +YWRlaXJvIEZhcmlhIExpbWEgLCAyOTI3MR0wGwYDVQQKExRNb2lwIFBhZ2FtZW50
    +b3MgUy5BLjENMAsGA1UECxMETU9JUDEYMBYGA1UECxMPU1NMIEJsaW5kYWRvIEVW
    +MRgwFgYDVQQDEw9hcGkubW9pcC5jb20uYnIwggEiMA0GCSqGSIb3DQEBAQUAA4IB
    +DwAwggEKAoIBAQDN0b9x6TrXXA9hPCF8/NjqGJ++2D4LO4ZiMFTjs0VwpXy2Y1Oe
    +s74/HuiLGnAHxTmAtV7IpZMibiOcTxcnDYp9oEWkf+gR+hZvwFZwyOBC7wyb3SR3
    +UvV0N1ZbEVRYpN9kuX/3vjDghjDmzzBwu8a/T+y5JTym5uiJlngVAWyh/RjtIvYi
    ++NVkQMbyVlPGkoCe6c30pH8DKYuUCZU6DHjUsPTX3jAskqbhDSAnclX9iX0p2bmw
    +KVBc+5Vh/2geyzDuquF0w+mNIYdU5h7uXvlmJnf3d2Cext5dxdL8/jezD3U0dAqI
    +pYSKERbyxSkJWxdvRlhdpM9YXMJcpc88xNp1AgMBAAGjggHcMIIB2DAfBgNVHSME
    +GDAWgBQ52v/KKBSKqHQTCLnkDqnS+n6daTAdBgNVHQ4EFgQU/lXuOa7DMExzZjRj
    +LQWcMWGZY7swDgYDVR0PAQH/BAQDAgWgMAwGA1UdEwEB/wQCMAAwHQYDVR0lBBYw
    +FAYIKwYBBQUHAwEGCCsGAQUFBwMCMEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQECAQUB
    +MCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5jb20vQ1BTMFYG
    +A1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0NPTU9ET1JT
    +QUV4dGVuZGVkVmFsaWRhdGlvblNlY3VyZVNlcnZlckNBLmNybDCBhwYIKwYBBQUH
    +AQEEezB5MFEGCCsGAQUFBzAChkVodHRwOi8vY3J0LmNvbW9kb2NhLmNvbS9DT01P
    +RE9SU0FFeHRlbmRlZFZhbGlkYXRpb25TZWN1cmVTZXJ2ZXJDQS5jcnQwJAYIKwYB
    +BQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbS8BgNVHREEKDAmgg9hcGku
    +bW9pcC5jb20uYnKCE3d3dy5hcGkubW9pcC5jb20uYnIwDQYJKoZIhvcNAQELBQAD
    +ggEBAFoTmPlaDcf+nudhjXHwud8g7/LRyA8ucb+3/vfmgbn7FUc1eprF5sJS1mA+
    +pbiTyXw4IxcJq2KUj0Nw3IPOe9k84mzh+XMmdCKH+QK3NWkE9Udz+VpBOBc0dlqC
    +1RH5umStYDmuZg/8/r652eeQ5kUDcJyADfpKWBgDPYaGtwzKVT4h3Aok9SLXRHx6
    +z/gOaMjEDMarMCMw4VUIG1pvNraZrG5oTaALPaIXXpd8VqbQYPudYJ6fR5eY3FeW
    +H/ofbYFdRcuD26MfBFWE9VGGral9Fgo8sEHffho+UWhgApuQV4/l5fMzxB5YBXyQ
    +jhuy8PqqZS9OuLilTeLu4a8z2JI=\n+-----END CERTIFICATE-----`
    +\n+var comodoIntermediateSHA384 = `-----BEGIN CERTIFICATE-----
    +MIIGDjCCA/agAwIBAgIQBqdDgNTr/tQ1taP34Wq92DANBgkqhkiG9w0BAQwFADCB
    +hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
    +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV
    +BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTIwMjEy
    +MDAwMDAwWhcNMjcwMjExMjM1OTU5WjCBkjELMAkGA1UEBhMCR0IxGzAZBgNVBAgT
    +EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
    +Q09NT0RPIENBIExpbWl0ZWQxODA2BgNVBAMTL0NPTU9ETyBSU0EgRXh0ZW5kZWQg
    +VmFsaWRhdGlvbiBTZWN1cmUgU2VydmVyIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
    +AQ8AMIIBCgKCAQEAlVbeVLTf1QJJe9FbXKKyHo+cK2JMK40SKPMalaPGEP0p3uGf
    +CzhAk9HvbpUQ/OGQF3cs7nU+e2PsYZJuTzurgElr3wDqAwB/L3XVKC/sVmePgIOj
    +vdwDmZOLlJFWW6G4ajo/Br0OksxgnP214J9mMF/b5pTwlWqvyIqvgNnmiDkBfBzA
    +xSr3e5Wg8narbZtyOTDr0VdVAZ1YEZ18bYSPSeidCfw8/QpKdhQhXBZzQCMZdMO6
    +WAqmli7eNuWf0MLw4eDBYuPCGEUZUaoXHugjddTI0JYT/8ck0YwLJ66eetw6YWNg
    +iJctXQUL5Tvrrs46R3N2qPos3cCHF+msMJn4HwIDAQABo4IBaTCCAWUwHwYDVR0j
    +BBgwFoAUu69+Aj36pvE8hI6t7jiY7NkyMtQwHQYDVR0OBBYEFDna/8ooFIqodBMI
    +ueQOqdL6fp1pMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMD4G
    +A1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwczovL3NlY3VyZS5j
    +b21vZG8uY29tL0NQUzBMBgNVHR8ERTBDMEGgP6A9hjtodHRwOi8vY3JsLmNvbW9k
    +b2NhLmNvbS9DT01PRE9SU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDBxBggr
    +BgEFBQcBAQRlMGMwOwYIKwYBBQUHMAKGL2h0dHA6Ly9jcnQuY29tb2RvY2EuY29t
    +L0NPTU9ET1JTQUFkZFRydXN0Q0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2Nz
    +cC5jb21vZG9jYS5jb20wDQYJKoZIhvcNAQEMBQADggIBAERCnUFRK0iIXZebeV4R
    +AUpSGXtBLMeJPNBy3IX6WK/VJeQT+FhlZ58N/1eLqYVeyqZLsKeyLeCMIs37/3mk
    +jCuN/gI9JN6pXV/kD0fQ22YlPodHDK4ixVAihNftSlka9pOlk7DgG4HyVsTIEFPk
    +1Hax0VtpS3ey4E/EhOfUoFDuPPpE/NBXueEoU/1Tzdy5H3pAvTA/2GzS8+cHnx8i
    +teoiccsq8FZ8/qyo0QYPFBRSTP5kKwxpKrgNUG4+BAe/eiCL+O5lCeHHSQgyPQ0o
    +fkkdt0rvAucNgBfIXOBhYsvss2B5JdoaZXOcOBCgJjqwyBZ9kzEi7nQLiMBciUEA
    +KKlHMd99SUWa9eanRRrSjhMQ34Ovmw2tfn6dNVA0BM7pINae253UqNpktNEvWS5e
    +ojZh1CSggjMziqHRbO9haKPl0latxf1eYusVqHQSTC8xjOnB3xBLAer2VBvNfzu9
    +XJ/B288ByvK6YBIhMe2pZLiySVgXbVrXzYxtvp5/4gJYp9vDLVj2dAZqmvZh+fYA
    +tmnYOosxWd2R5nwnI4fdAw+PKowegwFOAWEMUnNt/AiiuSpm5HZNMaBWm9lTjaK2
    +jwLI5jqmBNFI+8NKAnb9L9K8E7bobTQk+p0pisehKxTxlgBzuRPpwLk6R1YCcYAn
    +pLwltum95OmYdBbxN4SBB7SC
    +-----END CERTIFICATE-----`
    +\n+const comodoRSARoot = `-----BEGIN CERTIFICATE-----
    +MIIFdDCCBFygAwIBAgIQJ2buVutJ846r13Ci/ITeIjANBgkqhkiG9w0BAQwFADBv
    +MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFk
    +ZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBF
    +eHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFow
    +gYUxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
    +BgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMSswKQYD
    +VQQDEyJDT01PRE8gUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkq
    +hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAkehUktIKVrGsDSTdxc9EZ3SZKzejfSNw
    +AHG8U9/E+ioSj0t/EFa9n3Byt2F/yUsPF6c947AEYe7/EZfH9IY+Cvo+XPmT5jR6
    +2RRr55yzhaCCenavcZDX7P0N+pxs+t+wgvQUfvm+xKYvT3+Zf7X8Z0NyvQwA1onr
    +ayzT7Y+YHBSrfuXjbvzYqOSSJNpDa2K4Vf3qwbxstovzDo2a5JtsaZn4eEgwRdWt
    +4Q08RWD8MpZRJ7xnw8outmvqRsfHIKCxH2XeSAi6pE6p8oNGN4Tr6MyBSENnTnIq
    +m1y9TBsoilwie7SrmNnu4FGDwwlGTm0+mfqVF9p8M1dBPI1R7Qu2XK8sYxrfV8g/\n+vOldxJuvRZnio1oktLqpVj3Pb6r/SVi+8Kj/9Lit6Tf7urj0Czr56ENCHonYhMsT
    +8dm74YlguIwoVqwUHZwK53Hrzw7dPamWoUi9PPevtQ0iTMARgexWO/bTouJbt7IE
    +IlKVgJNp6I5MZfGRAy1wdALqi2cVKWlSArvX31BqVUa/oKMoYX9w0MOiqiwhqkfO
    +KJwGRXa/ghgntNWutMtQ5mv0TIZxMOmm3xaG4Nj/QN370EKIf6MzOi5cHkERgWPO
    +GHFrK+ymircxXDpqR+DDeVnWIBqv8mqYqnK8V0rSS527EPywTEHl7R09XiidnMy/\n+s1Hap0flhFMCAwEAAaOB9DCB8TAfBgNVHSMEGDAWgBStvZh6NLQm9/rEJlTvA73g
    +JMtUGjAdBgNVHQ4EFgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQD
    +AgGGMA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0gBAowCDAGBgRVHSAAMEQGA1UdHwQ9
    +MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9BZGRUcnVzdEV4dGVy
    +bmFsQ0FSb290LmNybDA1BggrBgEFBQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0dHA6
    +Ly9vY3NwLnVzZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggEBAGS/g/FfmoXQ
    +zbihKVcN6Fr30ek+8nYEbvFScLsePP9NDXRqzIGCJdPDoCpdTPW6i6FtxFQJdcfj
    +Jw5dhHk3QBN39bSsHNA7qxcS1u80GH4r6XnTq1dFDK8o+tDb5VCViLvfhVdpfZLY
    +Uspzgb8c8+a4bmYRBbMelC1/kZWSWfFMzqORcUx8Rww7Cxn2obFshj5cqsQugsv5
    +B5a6SE2Q8pTIqXOi6wZ7I53eovNNVZ96YUWYGGjHXkBrI/V5eu+MtWuLt29G9Hvx
    +PUsE2JOAWVrgQSQdso8VYFhH2+9uRv0V9dlfmrPb2LjkQLPNlzmuhbsdjrzch5vR
    +pu/xO28QOG8=\n+-----END CERTIFICATE-----`
    

コアとなるコードの解説

src/pkg/crypto/x509/x509.go の変更

_ "crypto/sha512" の追加は、Go言語における「ブランクインポート」の典型的な使用例です。

  • Goのビルドシステムは、インポートされたパッケージの init() 関数を、そのパッケージ内の他の関数が呼び出されるかどうかにかかわらず、プログラムの起動時に実行します。
  • crypto/sha512 パッケージの init() 関数は、SHA-384とSHA-512のハッシュアルゴリズムを、Goの crypto パッケージが内部的に管理するハッシュアルゴリズムのグローバルレジストリに登録します。
  • crypto/x509 パッケージは、X.509証明書を解析し、その署名アルゴリズム(例: sha384WithRSAEncryption)を識別すると、このグローバルレジストリから対応するハッシュ関数(この場合はSHA-384)を検索して取得します。
  • このブランクインポートにより、crypto/x509 パッケージは明示的に crypto/sha512 パッケージの関数を呼び出すことなく、SHA-384およびSHA-512ハッシュアルゴリズムを利用できるようになります。これにより、crypto/x509 パッケージのコードを直接変更することなく、新しいハッシュアルゴリズムのサポートを追加できます。

src/pkg/crypto/x509/verify_test.go の変更

このファイルへの変更は、SHA-384署名の中間証明書が正しく検証されることを保証するためのテストカバレッジを追加するものです。

  • verifyTests スライスは、様々な証明書検証シナリオを定義する verifyTest 構造体のコレクションです。
  • 新しく追加された verifyTest エントリは、以下の要素を含みます。
    • leaf: Moipのリーフ証明書(api.moip.com.br 用)。
    • intermediates: ComodoのSHA-384署名中間証明書(COMODO RSA Extended Validation Secure Server CA)。
    • roots: ComodoのRSAルート証明書(COMODO RSA Certification Authority)。
    • currentTime: 検証時のタイムスタンプ。証明書の有効期間チェックに使用されます。
    • dnsName: 検証対象のホスト名。
    • expectedChains: 期待される証明書チェーン。このテストでは、リーフ証明書からルート証明書までの3つの証明書が正しく連結されることを期待しています。

このテストケースは、実際のComodoとMoipの証明書データを使用しており、Goの crypto/x509 パッケージが現実世界のSHA-384署名証明書チェーンを問題なく処理できることを確認するための重要な検証となります。

関連リンク

参考にした情報源リンク

  • RFC 5280: Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile (X.509証明書の詳細な仕様)
  • SHA-2 (Wikipedia): https://ja.wikipedia.org/wiki/SHA-2
  • デジタル署名 (Wikipedia): https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D
  • Comodo (Sectigo) 公式サイト: https://sectigo.com/ (当時のComodoの状況を理解するための背景情報)
  • Go言語のブランクインポートに関する情報 (例: Effective Go): https://go.dev/doc/effective_go#blank_imports
  • Go言語の init 関数に関する情報 (例: Go by Example): https://gobyexample.com/init
  • Go言語の crypto パッケージにおけるハッシュアルゴリズムの登録メカニズムに関する一般的な情報 (Goのソースコードや関連する議論から推測)
  • SHA-384とSHA-512の違いに関する情報 (暗号技術関連の資料)
  • SSL/TLS証明書チェーンの検証プロセスに関する一般的な情報 (SSL/TLSの基本概念)
  • Go言語のコードレビューシステム (Gerrit) のCLリンク: https://golang.org/cl/87670045 (コミットメッセージに記載されている元のCL)
  • Go言語のコミット履歴と関連するバグトラッカーの議論 (GoのIssue Trackerなど、必要に応じて)