github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/crypto/x509/verify.go (about) 1 // Copyright 2011 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package x509 6 7 import ( 8 "github.com/shogo82148/std/time" 9 ) 10 11 type InvalidReason int 12 13 const ( 14 15 // NotAuthorizedToSignは、他のCA証明書としてマークされていない証明書によって署名された場合に発生する結果です。 16 NotAuthorizedToSign InvalidReason = iota 17 18 // VerifyOptionsで指定された時間に基づき、証明書が期限切れとなった結果を返します。 19 Expired 20 21 // CANotAuthorizedForThisNameは、中間またはルート証明書に、葉証明書でDNSまたはその他の名前(IPアドレスを含む)を許可しない制約がある場合に発生します。 22 CANotAuthorizedForThisName 23 24 // TooManyIntermediatesは、パスの長さ制約が違反された場合に発生します。 25 TooManyIntermediates 26 27 // IncompatibleUsageは、証明書のキーの使用法が異なる目的でのみ使用できることを示す場合に発生します。 28 IncompatibleUsage 29 30 // NameMismatchは、親の証明書のサブジェクト名が子の発行者名と一致しない場合に発生します。 31 NameMismatch 32 // NameConstraintsWithoutSANsは、過去のエラーであり、もはや返されなくなりました。 33 NameConstraintsWithoutSANs 34 35 // UnconstrainedNameは、CA証明書に許容される名前制約が含まれているが、 36 // リーフ証明書にはサポートされていないまたは制約のないタイプの名前が含まれている場合の結果です。 37 UnconstrainedName 38 39 // TooManyConstraintsは、証明書を検証するために必要な比較操作の数が、VerifyOptions.MaxConstraintComparisonsで設定された制限を超える場合に発生します。この制限は、CPU時間の過剰な消費を防ぐために存在します。 40 TooManyConstraints 41 42 // CANotAuthorizedForExtKeyUsage は、中間証明書またはルート証明書が要求された拡張キー使用法を許可しない場合に発生します。 43 CANotAuthorizedForExtKeyUsage 44 ) 45 46 // CertificateInvalidErrorは、奇妙なエラーが発生した場合に結果が返されます。このライブラリのユーザーはおそらく、これらのエラーを統一的に処理したいと考えるでしょう。 47 type CertificateInvalidError struct { 48 Cert *Certificate 49 Reason InvalidReason 50 Detail string 51 } 52 53 func (e CertificateInvalidError) Error() string 54 55 // HostnameErrorは、許可された名前のセットが要求された名前と一致しない場合に発生します。 56 type HostnameError struct { 57 Certificate *Certificate 58 Host string 59 } 60 61 func (h HostnameError) Error() string 62 63 // UnknownAuthorityErrorは、証明書の発行者が不明な場合に発生します。 64 type UnknownAuthorityError struct { 65 Cert *Certificate 66 67 // hintErrには、権限が見つからなかった原因を特定するのに役立つかもしれないエラーが含まれています。 68 hintErr error 69 70 // hintCertには、hintErrのエラーのために却下された可能性のある認証局の証明書が含まれています。 71 hintCert *Certificate 72 } 73 74 func (e UnknownAuthorityError) Error() string 75 76 // システムのルート証明書の読み込みに失敗した場合、SystemRootsErrorが発生します。 77 type SystemRootsError struct { 78 Err error 79 } 80 81 func (se SystemRootsError) Error() string 82 83 func (se SystemRootsError) Unwrap() error 84 85 // VerifyOptionsにはCertificate.Verifyのパラメータが含まれています。 86 type VerifyOptions struct { 87 88 // DNSNameが設定されている場合は、Certificate.VerifyHostnameまたはプラットフォームの検証器で葉証明書と照合されます。 89 DNSName string 90 91 // Intermediatesは、信頼アンカーではないが、リーフ証明書からルート証明書までのチェーンを形成するために使用できるオプションの証明書のプールです。 92 Intermediates *CertPool 93 94 // Rootsは、リーフ証明書がチェーンアップするために必要な信頼できるルート証明書のセットです。nilの場合、システムのルートまたはプラットフォームの検証器が使用されます。 95 Roots *CertPool 96 97 // CurrentTimeは、チェーン内のすべての証明書の有効性を確認するために使用されます。 98 // ゼロの場合、現在の時刻が使用されます。 99 CurrentTime time.Time 100 101 // KeyUsagesは受け入れ可能な拡張キー利用法(Extended Key Usage)の値を指定します。リストされた値のいずれかを許可する場合、チェーンは受け入れられます。空のリストはExtKeyUsageServerAuthを意味します。どんなキー利用法でも受け入れる場合は、ExtKeyUsageAnyを含めてください。 102 KeyUsages []ExtKeyUsage 103 104 // MaxConstraintComparisionsは、指定された証明書の名前制約をチェックする際に行う比較の最大数です。 105 // ゼロの場合、適切なデフォルト値が使用されます。この制限によって、病的な証明書が検証時に過剰なCPU時間を消費するのを防ぎます。 106 // この制限は、プラットフォームの検証ツールには適用されません。 107 MaxConstraintComparisions int 108 } 109 110 // Verifyは、オプションのRootsの証明書を使用して、cからaの証明書までの1つ以上のチェーンを構築し、検証を試みます。成功すると、最初のチェーン要素はcで、最後の要素はopts.Rootsから来ます。 111 // opts.Rootsがnilの場合、プラットフォームの検証プログラムが使用される可能性があります。この場合、検証の詳細は以下の説明と異なる場合があります。システムのルートが利用できない場合、返されるエラーはSystemRootsError型です。 112 // 中間証明書の名前制約は、opts.DNSNameだけでなく、チェーン内で要求されるすべての名前に適用されます。したがって、中間証明書が許可しない場合でも、葉がexample.comを要求することは無効です。ただし、DirectoryName制約はサポートされていません。 113 // 名前制約の検証は、RFC 5280の規則に従います。ただし、DNS名の制約は、電子メールやURIで定義された先頭のピリオド形式を使用できます。制約に先頭のピリオドがある場合、有効な制約名を構成するために少なくとも1つの追加のラベルが前置される必要があります。 114 // 拡張キー使用(Extended Key Usage)の値は、チェーンが入れ子になった形で強制されます。したがって、EKUを列挙する中間証明書やルート証明書は、そのリストに含まれていないEKUを持つ葉がアサートすることを防ぎます。(これは明示されていませんが、CAが発行できる証明書の種類を制限するために一般的に行われています。) 115 // SHA1WithRSAおよびECDSAWithSHA1の署名を使用する証明書はサポートされておらず、チェーンの構築には使用されません。 116 // 返されるチェーンのc以外の証明書は変更しないでください。 117 // 警告:この関数はリボケーション(証明書の失効チェック)を行いません。 118 func (c *Certificate) Verify(opts VerifyOptions) (chains [][]*Certificate, err error) 119 120 // VerifyHostnameは指定されたホストに対して、cが有効な証明書であればnilを返します。 121 // それ以外の場合、ミスマッチを説明するエラーを返します。 122 // 123 // IPアドレスはオプションで角括弧で囲まれ、IPAddressesフィールドと照合されます。 124 // それ以外の名前は、DNSNamesフィールドで大文字小文字を区別せずにチェックされます。 125 // 名前が有効なホスト名である場合、証明書のフィールドにはワイルドカードが完全な左端のラベルとして含まれている場合があります(例: *.example.com)。 126 // 127 // レガシーのCommon Nameフィールドは無視されることに注意してください。 128 func (c *Certificate) VerifyHostname(h string) error