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

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

このコミットは、Go言語のcrypto/x509パッケージにおいて、Entrust社が発行した特定のルート証明書がPKIX(Public Key Infrastructure X.509)の要件を満たしていないために発生する証明書検証エラーを回避するための修正を導入しています。具体的には、Entrustの「Entrust.net Certification Authority (2048)」というルート証明書が、CA(Certificate Authority)証明書として適切にマークされていないという問題に対応しています。これにより、このルート証明書にチェーンする(依存する)証明書(例: gateway.push.apple.com:2195)の検証がGoプログラムで失敗する事態が発生していました。このコミットは、当該の壊れた証明書をそのSubjectPublicKeyInfo (SPKI)によって識別し、その証明書に対してのみBasic Constraintsのチェックを免除するという、一時的な回避策(bodge/hack)を実装しています。

コミット

commit 685a61df7ec3c559b1369576731b66d32a5790b8
Author: Adam Langley <agl@golang.org>
Date:   Tue Jul 10 15:57:51 2012 -0400

    crypto/x509: exempt broken Entrust certificate from checks.
    
    Entrust have issued a root certificate that's not marked as valid for
    signing certificates.
    
    This results in Go programs failing to validate certificates that
    chain up to this root (i.e. gateway.push.apple.com:2195).
    
    Although this is clearly a mistake on Entrust's part, it seems that we
    will have to bodge around it.
    
    R=golang-dev, dave, r
    CC=golang-dev
    https://golang.org/cl/6346064

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

https://github.com/golang/go/commit/685a61df7ec3c559b1369576731b66d32a5790b8

元コミット内容

crypto/x509: exempt broken Entrust certificate from checks.

Entrust have issued a root certificate that's not marked as valid for
signing certificates.

This results in Go programs failing to validate certificates that
chain up to this root (i.e. gateway.push.apple.com:2195).

Although this is clearly a mistake on Entrust's part, it seems that we
will have to bodge around it.

R=golang-dev, dave, r
CC=golang-dev
https://golang.org/cl/6346064

変更の背景

この変更の背景には、Entrust社が発行した特定のルート証明書「Entrust.net Certification Authority (2048)」が、X.509証明書の標準仕様であるPKIXに準拠していないという問題がありました。具体的には、このルート証明書が「CA証明書として有効である」ことを示すべき「Basic Constraints」拡張の「cA」フィールドが適切に設定されていなかったため、Go言語のcrypto/x509パッケージによる証明書検証プロセスにおいて、この証明書を信頼されたCAとして認識できず、検証が失敗していました。

この問題は、特にgateway.push.apple.com:2195のような、このEntrustルート証明書にチェーンする(つまり、このルート証明書によって署名された中間証明書やエンドエンティティ証明書を使用している)サービスとの通信に影響を与えました。Goプログラムがこれらのサービスに接続しようとすると、証明書検証エラーにより接続が確立できないという実用上の問題が発生していました。

Entrust側の明らかな誤りであるにもかかわらず、Go言語のユーザーが広範囲に影響を受けることを避けるため、Goチームは一時的な回避策を導入する必要があると判断しました。このコミットは、その「bodge」(間に合わせの修正、ハック)として位置づけられています。将来的にはEntrustが修正されたルート証明書を広く配布し、それが普及した時点でこの回避策は削除される予定でした。

前提知識の解説

このコミットを理解するためには、以下の暗号技術および証明書関連の概念を理解しておく必要があります。

  • X.509 証明書: 公開鍵暗号の標準フォーマットであり、公開鍵と、その公開鍵の所有者に関する情報(名前、組織など)を関連付け、信頼された第三者(認証局、CA)がデジタル署名したものです。ウェブサイトのHTTPS通信やコード署名など、様々なセキュリティプロトコルで利用されます。
  • ルート証明書 (Root Certificate): 認証局(CA)の公開鍵を含む自己署名証明書です。信頼の鎖(Chain of Trust)の最上位に位置し、オペレーティングシステムやブラウザ、アプリケーションにあらかじめ組み込まれて信頼されています。
  • 認証局 (CA: Certificate Authority): デジタル証明書を発行し、公開鍵の所有者の身元を保証する信頼された第三者機関です。
  • 証明書のチェーン (Certificate Chain): エンドエンティティ証明書(例: ウェブサイトの証明書)から始まり、中間証明書を介して最終的に信頼されたルート証明書に至るまでの証明書の階層構造です。各証明書は、その上位の証明書によって署名されています。
  • PKIX (Public Key Infrastructure X.509): X.509証明書とそれに関連するインフラストラクチャの標準を定義するフレームワークです。証明書の構造、検証プロセス、失効リストなどを規定しています。
  • Basic Constraints 拡張: X.509証明書に含まれる重要な拡張フィールドの一つで、証明書がCA証明書であるか否か、およびCA証明書である場合にそのCAが発行できる証明書のパス長制限などを定義します。CA証明書である場合、cAフィールドがTRUEに設定されている必要があります。
  • SubjectPublicKeyInfo (SPKI): X.509証明書の一部であり、証明書の公開鍵とその公開鍵のアルゴリズムに関する情報を含みます。公開鍵のハッシュ値や、公開鍵そのもののバイナリ表現として利用されます。このコミットでは、特定の壊れたルート証明書を一意に識別するために、このSPKIのバイナリ表現が利用されています。

技術的詳細

このコミットが対処している問題は、Entrust社の特定のルート証明書「CN=Entrust.net Certification Authority (2048)」が、PKIXの要件に違反している点にあります。PKIXでは、CA証明書はBasic Constraints拡張を持ち、その中のcAフィールドがTRUEである必要があります。しかし、問題のEntrustルート証明書では、このcAフィールドがTRUEに設定されていませんでした。

Go言語のcrypto/x509パッケージは、証明書チェーンの検証を行う際に、親証明書がCA証明書として適切にマークされているか(すなわち、BasicConstraintsValidtrueで、かつIsCAtrueであるか)を厳密にチェックします。このチェックは、Certificate.CheckSignatureFrom関数内で行われます。Entrustの壊れたルート証明書は、このチェックに合格しないため、そのルート証明書にチェーンするすべての証明書の検証が失敗していました。

このコミットでは、この問題を回避するために、以下の技術的アプローチが取られています。

  1. 壊れた証明書の識別: 問題のEntrustルート証明書を、そのSubjectPublicKeyInfoのバイナリ表現によって一意に識別します。これは、証明書の公開鍵とそのアルゴリズムを組み合わせたデータ構造であり、証明書ごとに固有の値となります。コミットでは、この特定のSPKIのバイト列をentrustBrokenSPKIという定数として定義しています。
  2. Basic Constraintsチェックの免除: Certificate.CheckSignatureFrom関数内で、親証明書がCA証明書として適切にマークされているかどうかのチェックを行う際に、その親証明書のSubjectPublicKeyInfoentrustBrokenSPKIと一致する場合に限り、このチェックをスキップするように変更します。これにより、Entrustの壊れたルート証明書がCAとして適切にマークされていなくても、Goの検証ロジックがエラーを発生させなくなります。

このアプローチは、特定の既知の壊れた証明書に対してのみ適用される「ハードコードされた例外」であり、一般的な証明書検証ロジックの健全性を損なうことなく、実用上の問題を解決するための「ハック」として機能します。コミットメッセージにもあるように、これは一時的な解決策であり、Entrustが修正版のルート証明書を配布し、それが広く普及した際には削除されるべきであると明記されています。

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

変更はsrc/pkg/crypto/x509/x509.goファイルに集中しています。

--- a/src/pkg/crypto/x509/x509.go
+++ b/src/pkg/crypto/x509/x509.go
@@ -433,6 +433,55 @@ func (c *Certificate) Equal(other *Certificate) bool {
 	return bytes.Equal(c.Raw, other.Raw)
 }
 
+// Entrust have a broken root certificate (CN=Entrust.net Certification
+// Authority (2048)) which isn't marked as a CA certificate and is thus invalid
+// according to PKIX.
+// We recognise this certificate by its SubjectPublicKeyInfo and exempt it
+// from the Basic Constraints requirement.
+// See http://www.entrust.net/knowledge-base/technote.cfm?tn=7869
+//
+// TODO(agl): remove this hack once their reissued root is sufficiently
+// widespread.
+var entrustBrokenSPKI = []byte{
+	0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09,
+	0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
+	0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00,
+	0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01,
+	0x00, 0x97, 0xa3, 0x2d, 0x3c, 0x9e, 0xde, 0x05,
+	0xda, 0x13, 0xc2, 0x11, 0x8d, 0x9d, 0x8e, 0xe3,
+	0x7f, 0xc7, 0x4b, 0x7e, 0x5a, 0x9f, 0xb3, 0xff,
+	0x62, 0xab, 0x73, 0xc8, 0x28, 0x6b, 0xba, 0x10,
+	0x64, 0x82, 0x87, 0x13, 0xcd, 0x57, 0x18, 0xff,
+	0x28, 0xce, 0xc0, 0xe6, 0x0e, 0x06, 0x91, 0x50,
+	0x29, 0x83, 0xd1, 0xf2, 0xc3, 0x2a, 0xdb, 0xd8,
+	0xdb, 0x4e, 0x04, 0xcc, 0x00, 0xeb, 0x8b, 0xb6,
+	0x96, 0xdc, 0xbc, 0xaa, 0xfa, 0x52, 0x77, 0x04,
+	0xc1, 0xdb, 0x19, 0xe4, 0xae, 0x9c, 0xfd, 0x3c,
+	0x8b, 0x03, 0xef, 0x4d, 0xbc, 0x1a, 0x03, 0x65,
+	0xf9, 0xc1, 0xb1, 0x3f, 0x72, 0x86, 0xf2, 0x38,
+	0xaa, 0x19, 0xae, 0x10, 0x88, 0x78, 0x28, 0xda,
+	0x75, 0xc3, 0x3d, 0x02, 0x82, 0x02, 0x9c, 0xb9,
+	0xc1, 0x65, 0x77, 0x76, 0x24, 0x4c, 0x98, 0xf7,
+	0x6d, 0x31, 0x38, 0xfb, 0xdb, 0xfe, 0xdb, 0x37,
+	0x02, 0x76, 0xa1, 0x18, 0x97, 0xa6, 0xcc, 0xde,
+	0x20, 0x09, 0x49, 0x36, 0x24, 0x69, 0x42, 0xf6,
+	0xe4, 0x37, 0x62, 0xf1, 0x59, 0x6d, 0xa9, 0x3c,
+	0xed, 0x34, 0x9c, 0xa3, 0x8e, 0xdb, 0xdc, 0x3a,
+	0xd7, 0xf7, 0x0a, 0x6f, 0xef, 0x2e, 0xd8, 0xd5,
+	0x93, 0x5a, 0x7a, 0xed, 0x08, 0x49, 0x68, 0xe2,
+	0x41, 0xe3, 0x5a, 0x90, 0xc1, 0x86, 0x55, 0xfc,
+	0x51, 0x43, 0x9d, 0xe0, 0xb2, 0xc4, 0x67, 0xb4,
+	0xcb, 0x32, 0x31, 0x25, 0xf0, 0x54, 0x9f, 0x4b,
+	0xd1, 0x6f, 0xdb, 0xd4, 0xdd, 0xfc, 0xaf, 0x5e,
+	0x6c, 0x78, 0x90, 0x95, 0xde, 0xca, 0x3a, 0x48,
+	0xb9, 0x79, 0x3c, 0x9b, 0x19, 0xd6, 0x75, 0x05,
+	0xa0, 0xf9, 0x88, 0xd7, 0xc1, 0xe8, 0xa5, 0x09,
+	0xe4, 0x1a, 0x15, 0xdc, 0x87, 0x23, 0xaa, 0xb2,
+	0x75, 0x8c, 0x63, 0x25, 0x87, 0xd8, 0xf8, 0x3d,
+	0xa6, 0xc2, 0xcc, 0x66, 0xff, 0xa5, 0x66, 0x68,
+	0x55, 0x02, 0x03, 0x01, 0x00, 0x01,
+}
+
 // CheckSignatureFrom verifies that the signature on c is a valid signature
 // from parent.
 func (c *Certificate) CheckSignatureFrom(parent *Certificate) (err error) {
@@ -441,8 +490,10 @@ func (c *Certificate) CheckSignatureFrom(parent *Certificate) (err error) {\n 	// certificate, or the extension is present but the cA boolean is not\n 	// asserted, then the certified public key MUST NOT be used to verify\n 	// certificate signatures.\"\n-\tif parent.Version == 3 && !parent.BasicConstraintsValid ||\n-\t\tparent.BasicConstraintsValid && !parent.IsCA {\n+\t// (except for Entrust, see comment above entrustBrokenSPKI)\n+\tif (parent.Version == 3 && !parent.BasicConstraintsValid ||\n+\t\tparent.BasicConstraintsValid && !parent.IsCA) &&\n+\t\t!bytes.Equal(c.RawSubjectPublicKeyInfo, entrustBrokenSPKI) {\n \t\treturn ConstraintViolationError{}\n \t}\n \n```

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

このコミットの主要な変更点は以下の2つです。

1.  **`entrustBrokenSPKI` 変数の追加**:
    `src/pkg/crypto/x509/x509.go`の冒頭付近に、`entrustBrokenSPKI`というグローバルなバイトスライス変数が追加されています。このバイトスライスは、問題のEntrustルート証明書(CN=Entrust.net Certification Authority (2048))の`SubjectPublicKeyInfo`のDER(Distinguished Encoding Rules)エンコードされたバイナリ表現をハードコードしたものです。
    この変数のコメントには、この証明書がPKIXに従って無効であること、そしてこのSPKIによって識別し、Basic Constraintsの要件から免除することが説明されています。また、`TODO(agl)`として、Entrustが再発行したルート証明書が十分に普及した際にはこのハックを削除すべきであるという指示も含まれています。

2.  **`CheckSignatureFrom` 関数の条件変更**:
    `CheckSignatureFrom`関数は、親証明書が子証明書に署名する権限を持っているか(つまり、親が有効なCA証明書であるか)を検証する役割を担っています。元のコードでは、親証明書がX.509 v3証明書であり、かつ`BasicConstraintsValid`が`false`であるか、または`BasicConstraintsValid`が`true`であるにもかかわらず`IsCA`が`false`である場合にエラー(`ConstraintViolationError{}`)を返していました。これは、親証明書がCA証明書として適切にマークされていない場合に発生するエラーです。

    このコミットでは、このエラーを返す条件に`&& !bytes.Equal(c.RawSubjectPublicKeyInfo, entrustBrokenSPKI)`という条件が追加されています。
    *   `c.RawSubjectPublicKeyInfo`は、現在検証中の子証明書(`c`)の`SubjectPublicKeyInfo`の生データです。
    *   `bytes.Equal`関数は、2つのバイトスライスが等しいかどうかを比較します。

    この追加された条件は、「現在検証中の子証明書の`SubjectPublicKeyInfo`が、壊れたEntrustルート証明書のSPKIと**等しくない**場合」にのみ、元のBasic Constraintsチェックを適用するという意味になります。
    言い換えれば、もし子証明書がまさにその壊れたEntrustルート証明書である場合(つまり、`c.RawSubjectPublicKeyInfo`が`entrustBrokenSPKI`と一致する場合)、Basic Constraintsのチェックはスキップされ、エラーは発生しなくなります。これにより、Goの証明書検証ロジックは、この特定の壊れたEntrustルート証明書を特別扱いし、その不適切なBasic Constraints設定を無視して、その証明書にチェーンする他の証明書の検証を続行できるようになります。

## 関連リンク

*   Go CL (Code Review) リンク: [https://golang.org/cl/6346064](https://golang.org/cl/6346064)
*   Entrust Knowledge Base Article: [http://www.entrust.net/knowledge-base/technote.cfm?tn=7869](http://www.entrust.net/knowledge-base/technote.cfm?tn=7869) (このリンクは古い可能性があり、現在アクセスできない場合があります。)

## 参考にした情報源リンク

*   Web search results for "Entrust.net Certification Authority (2048) broken root certificate Go x509":
    *   [https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQETdnZXgEjOk8ymPZEnUg787XWbOBcYBYl893I4WlNINbMnOXwFzg2BcDUys-Sk79HInzX8c0tc9P_3jMDJ9-e6_RPJUWsmggI1HP1LeKsk-5n4foTsRldAKcAwyZ43XGJCrK_uACOAUyTkf7vrpTD2tQ9d8wQvykNZ4teDriOEyV22FCHC8ojSDQ==](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQETdnZXgEjOk8ymPZEnUg787XWbOBcYBYl893I4WlNINbMnOXwFzg2BcDUys-Sk79HInzX8c0tc9P_3jMDJ4-e6_RPJUWsmggI1HP1LeKsk-5n4foTsRldAKcAwyZ43XGJCrK_uACOAUyTkf7vrpTD2tQ9d8wQvykNZ4teDriOEyV22FCHC8ojSDQ==)
    *   [https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQF0WaXhrVMc1-5krRbeUF-rKYllqCFLQc34lY3RGNqYpA12AVIL5W6NaYvyBclAyGYq8oKxCEpqfRV0PCokp6CMbVcZA9-iEG5DPUen7RJZf45wykwX0fwYoWpQJDQZasVm2iBYlGsW-nfklQahhy8R-mZpekCWbvyls3a4bmWq0kJH20QGmD5XCpDN3kubmpdHuX-zIgcItfmO1hbEqxYEqXgOsD4qff-TnlI=](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQF0WaXhrVMc1-5krRbeUF-rKYllqCFLQc34lY3RGNqYpA12AVIL5W6NaYvyBclAyGYq8oKxCEpqfRV0PCokp6CMbVcZA9-iEG5DPUen7RJZf45wykwX0fwYoWpQJDQZasVm2iBYlGsW-nfklQahhy8R-mZpekCWbvyls3a4bmWq0kJH20QGmD5XCpDN3kubmpdHuX-zIgcItfmO1hbEqxYEqXgOsD4qff-TnlI=)
    *   [https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQF-Q5bqF3nUnEoqX7kywLxF4vJa2dxixwCWXZMGwds5KWaVFfu15Zz9TCa3YGhU3ka2D8Ni5ElyssbNZUUlChh-PNGaEewVuSZ-_UTrj54cnHZHtl5T-qZhnOrDOAL252SjpzQafsggipRAeVh6AJWOUFYyp872_u6mAJc9YTwReXXCA8S7hBI9DllLA5sK2JIH-TwW](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQF-Q5bqF3nUnEoqX7kywLxF4vJa2dxixwCWXZMGwds5KWaVFfu15Zz9TCa3YGhU3ka2D8Ni5ElyssbNZUUlChh-PNGaEewVuSZ-_UTrj54cnHZHtl5T-qZhnOrDOAL252SjpzQafsggipRAeVh6AJWOUFYyp872_u6mAJc9YTwReXXCA8S7hBI9DllLA5sK2JIH-TwW)
    *   [https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEjeO-SCCtuFCmUd_aNAcZDNg0AQHGIJVG2E8cop9iUGq-eatXIKQjWc3R_StovKfjwK99hwmIPtY3ARJyiqgFQpfFbUSBOcTuAdJ_EcsdmPDskzNviHE8qxNavtpy4AKAKfcWVwBNogWfIWukjjwWEjUzHVZ4J3_kDDVCD6iACA6qPulLhmQ==](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEjeO-SCCtuFCmUd_aNAcZDNg0AQHGIJVG2E8cop9iUGq-eatXIKQjWc3R_StovKfjwK99hwmIPtY3ARJyiqgFQpfFbUSBOcTuAdJ_EcsdmPDskzNviHE8qxNavtpy4AKAKAKfcWVwBNogWfIWukjjwWEjUzHVZ4J3_kDDVCD6iACA6qPulLhmQ==)
    *   [https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQH_ckE_7Zd-OMgPU9tF4gWwfIWLERM8YxE1GoDHibUb46xxqjUfZvGGSU-7jAFuVaw8tBFz2w0gxtUJF0tHXJACiB2NFeGXZXXznpEpHQEOhF_9STWAaFGtOWhtP7tO0yzD4rtlBeWceqkPR1Fn8g7TVVVgZqVd1nnZHmiT2uuJ65WY9j5qtFD5xQ==](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQH_ckE_7Zd-OMgPU9tF4gWwfIWLERM8YxE1GoDHibUb46xxqjUfZvGGSU-7jAFuVaw8tBFz2w0gxtUJF0tHXJACiB2NFeGXZXXznpEpHQEOhF_9STWAaFGtOWhtP7tO0yzD4rtlBeWceqkPR1Fn8g7TVVVgZqVd1nnZHmiT2uuJ65WY9j5qtFD5xQ==)
    *   [https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGleiZ5R1roOS5HZ5sXQjWN0lg0Nm2AIQY2-LJvUJDRrYDFz6YLNet12lXd67LH9XWz_kjBjZjqEpAotoRpqH3tgGGFPWHnyuyloh84UlDyTwDqupu8yuy8Q70m73j4j91A4EnP](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGleiZ5R1roOS5HZ5sXQjWN0lg0Nm2AIQY2-LJvUJDRrYDFz6YLNet12lXd67LH9XWz_kjBjZjqEpAotoRpqH3tgGGFPWHnyuyloh84UlDyTwDqupu8yuy8Q70m73j4j91A4EnP)
    *   [https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGjWiUPlAgrLTeNion6I3eqTyUi0J7HPkvZVOm62S4oAwMCAs1csW1ryPeYh1nscRVpArSA8dU06GiyOs9BQPsSVUz08T5nr06Ak15yU0vOr_kEYVT6oBOS22LHrvBBvRC-2eSzYvdhUbDkiBrdZdefGQbrKVhO60rtxUv94z5s](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGjWiUPlAgrLTeNion6I3eqTyUi0J7HPkvZVOm62S4oAwMCAs1csW1ryPeYh1nscRVpArSA8dU06GiyOs9BQPsSVUz08T5nr06Ak15yU0vOr_kEYVT6oBOS22LHrvBBvRC-2eSzYvdhUbDkiBrdZdefGQbrKVhO60rtxUv94z5s)
    *   [https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFF-W3WdliMexl02cWqx7UqyUl08as-lpSxUhNbDYDE5sei6yRgys9LOb-mUd46jQ1cJMLIcLTxNJuMZCLYsntfQ-L2paPWSsX6CH_j6xqLUGXuVfiz5m_VztUVzeHDF4_qP1aLpW0s_O97z1HiqlgxLiYPpQ==](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFF-W3WdliMexl02cWqx7UqyUl08as-lpSxUhNbDYDE5sei6yRgys9LOb-mUd46jQ1cJMLIcLTxNJuMZCLYsntfQ-L2paPWSsX6CH_j6xqLUGXuVfiz5m_VztUVzeHDF4_qP1aLpW0s_O97z1HiqlgxLiYPpQ==)
    *   [https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEmWM_e4FkPhG9dhcSVU3W71ikhyt_wAID4MJHdKOxTJiWEHRmR4GTYhSYAcptgJ0AVgSgCHAnW-GS4X23ZP0vRMFhn0F9xP0_V6aSLNfXxdhoT9CGD4WZDU7iPHLyE1w7JCb9d_aICh0J-gjFH-C-iP9xpTipur1j79RQ8aA==](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEmWM_e4FkPhG9dhcSVU3W71ikhyt_wAID4MJHdKOxTJiWEHRmR4GTYhSYAcptgJ0AVgSgCHAnW-GS4X23ZP0vRMFhn0F9xP0_V6aSLNfXxdhoT9CGD4WZDU7iPHLyE1w7JCb9d_aICh0J-gjFH-C-iP9xpTipur1j79RQ8aA==)
    *   [https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQETUVIzpIs2ROUm_9-07U58eYLlZXciTcaPntW4Pye45vQCrTrDW2fPugWSzOMVjEXgy2dnhd9ps7WGS7xaFqvSbR2Ws-wHk1ToPB7J-ojkdDDMcLOV5wX3qKKS0-b1d4J9ZTZoYJCYivE5u0A8yxfIO_Mo4iLQ5xHF_RVYhTcskblSkHJCffTYdCy0iNws5w8djRwnNT1qFdiJIOHw10tahbFwkQJEZaV-6sovSmc8s86AiYs=](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQETUVIzpIs2ROUm_9-07U58eYLlZXciTcaPntW4Pye45vQCrTrDW2fPugWSzOMVjEXgy2dnhd9ps7WGS7xaFqvSbR2Ws-wHk1ToPB7J-ojkdDDMcLOV5wX3qKKS0-b1d4J9ZTZoYJCYivE5u0A8yxfIO_Mo4iLQ5xHF_RVYhTcskblSkHJCffTYdCy0iNws5w8djRwnNT1qFdiJIOHw10tahbFwkQJEZaV-6sovSmc8s86AiYs=)
*   [https://www.globalsign.com/en/blog/what-is-a-root-certificate](https://www.globalsign.com/en/blog/what-is-a-root-certificate)
*   [https://www.entrust.com/resources/certificate-solutions/digital-certificates](https://www.entrust.com/resources/certificate-solutions/digital-certificates)
*   [https://www.securew2.com/blog/what-is-a-certificate-authority](https://www.securew2.com/blog/what-is-a-certificate-authority)
*   [https://www.woshub.com/update-root-certificates-windows/](https://www.woshub.com/update-root-certificates-windows/)
*   [https://www.microfocus.com/documentation/enterprise-developer/ed80/ED-VS2019/HTML/GUID-21111111-1111-1111-1111-111111111111.html](https://www.microfocus.com/documentation/enterprise-developer/ed80/ED-VS2019/HTML/GUID-21111111-1111-1111-1111-111111111111.html)
*   [https://www.entrust.com/resources/certificate-solutions/digital-certificates/x509-certificates](https://www.entrust.com/resources/certificate-solutions/digital-certificates/x509-certificates)
*   [https://www.entrust.com/resources/certificate-solutions/digital-certificates/root-certificates](https://www.entrust.com/resources/certificate-solutions/digital-certificates/root-certificates)