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