github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/crypto/tls/common.go (about)

     1  // Copyright 2009 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 tls
     6  
     7  import (
     8  	"github.com/shogo82148/std/context"
     9  	"github.com/shogo82148/std/crypto"
    10  	"github.com/shogo82148/std/crypto/x509"
    11  	"github.com/shogo82148/std/io"
    12  	"github.com/shogo82148/std/net"
    13  	"github.com/shogo82148/std/sync"
    14  	"github.com/shogo82148/std/time"
    15  )
    16  
    17  const (
    18  	VersionTLS10 = 0x0301
    19  	VersionTLS11 = 0x0302
    20  	VersionTLS12 = 0x0303
    21  	VersionTLS13 = 0x0304
    22  
    23  	// Deprecated: SSLv3は暗号的に破損しており、
    24  	// このパッケージではサポートされていません。golang.org/issue/32716を参照してください。
    25  	VersionSSL30 = 0x0300
    26  )
    27  
    28  // VersionNameは提供されたTLSバージョン番号の名前(例:"TLS 1.3")を返します。
    29  // もしバージョンがこのパッケージで実装されていない場合は、値のフォールバック表現を返します。
    30  func VersionName(version uint16) string
    31  
    32  // CurveIDは楕円曲線のためのTLS識別子のタイプです。参照:
    33  // https://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-8.
    34  //
    35  // TLS 1.3では、このタイプはNamedGroupと呼ばれますが、現在のところ、
    36  // このライブラリは楕円曲線ベースのグループのみをサポートしています。RFC 8446、セクション4.2.7を参照してください。
    37  type CurveID uint16
    38  
    39  const (
    40  	CurveP256 CurveID = 23
    41  	CurveP384 CurveID = 24
    42  	CurveP521 CurveID = 25
    43  	X25519    CurveID = 29
    44  )
    45  
    46  // ConnectionStateは接続に関する基本的なTLSの詳細を記録します。
    47  type ConnectionState struct {
    48  	// Versionは接続で使用されるTLSバージョンです(例:VersionTLS12)。
    49  	Version uint16
    50  
    51  	// HandshakeComplete はハンドシェイクが完了している場合に true です。
    52  	HandshakeComplete bool
    53  
    54  	// DidResume は、この接続がセッションチケットや類似のメカニズムによって前のセッションから正常に再開された場合に true です。
    55  	DidResume bool
    56  
    57  	// CipherSuiteは、接続のためにネゴシエートされた暗号スイートです(例: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256、TLS_AES_128_GCM_SHA256)。
    58  	CipherSuite uint16
    59  
    60  	// NegotiatedProtocolはALPNで交渉されたアプリケーションプロトコルです。
    61  	NegotiatedProtocol string
    62  
    63  	// NegotiatedProtocolIsMutualは相互のNPN(Next Protocol Negotiation)交渉を示すために使われます。
    64  	//
    65  	// 廃止予定:この値は常にtrueです。
    66  	NegotiatedProtocolIsMutual bool
    67  
    68  	// ServerNameはクライアントが送信するServer Name Indication拡張機能の値です。これはサーバーとクライアントの両方で利用できます。
    69  	ServerName string
    70  
    71  	// PeerCertificates は、ピアから送信された証明書が解析されたものであり、送信順に格納されています。最初の要素は、接続が検証されるリーフ証明書です。
    72  	//
    73  	// クライアント側では空にすることはできません。サーバー側では、Config.ClientAuth が RequireAnyClientCert または RequireAndVerifyClientCert でない場合、空にすることができます。
    74  	//
    75  	// PeerCertificates およびその内容は変更してはいけません。
    76  	PeerCertificates []*x509.Certificate
    77  
    78  	// VerifiedChainsは、最初の要素がPeerCertificates[0]であり、最後の要素がConfig.RootCAs(クライアント側)またはConfig.ClientCAs(サーバー側)からの要素の1つ以上のチェーンのリストです。
    79  	//
    80  	// クライアント側では、Config.InsecureSkipVerifyがfalseの場合に設定されます。サーバー側では、Config.ClientAuthがVerifyClientCertIfGiven(かつピアが証明書を提供した場合)またはRequireAndVerifyClientCertである場合に設定されます。
    81  	//
    82  	// VerifiedChainsおよびその内容は変更しないでください。
    83  	VerifiedChains [][]*x509.Certificate
    84  
    85  	// SignedCertificateTimestampsは、もしあれば、ピアからのTLSハンドシェイクによって提供されるリーフ証明書のSCTのリストです。
    86  	SignedCertificateTimestamps [][]byte
    87  
    88  	// OCSPResponseは、ピアから提供される、必要に応じてリーフ証明書のステープル化されたオンライン証明書ステータスプロトコル(OCSP)レスポンスです。
    89  	OCSPResponse []byte
    90  
    91  	// TLSUniqueには、"tls-unique"チャネルバインディングの値が格納されています(RFC 5929、セクション3を参照)。
    92  	// この値は、TLS 1.3接続や拡張されたマスターシークレット(RFC 7627)をサポートしていない再開接続ではnilになります。
    93  	TLSUnique []byte
    94  
    95  	// ekmはExportKeyingMaterialを介して公開されるクロージャです。
    96  	ekm func(label string, context []byte, length int) ([]byte, error)
    97  }
    98  
    99  // ExportKeyingMaterialは、RFC 5705で定義されているように、新しいスライスにlengthバイトの
   100  // エクスポートされた鍵マテリアルを返します。contextがnilの場合、それはシードの一部として使用されません。
   101  // 接続がConfig.Renegotiationを介して再交渉を許可するように設定されていた場合、または接続がTLS 1.3も
   102  // Extended Master Secretもサポートしていない場合、この関数はエラーを返します。
   103  //
   104  // Extended Master SecretまたはTLS 1.3なしでの鍵マテリアルのエクスポートは、
   105  // セキュリティ上の問題(RFC 5705とRFC 7627のセキュリティ考慮事項セクションを参照)により、
   106  // Go 1.22で無効化されましたが、GODEBUG設定tlsunsafeekm=1で再度有効化できます。
   107  func (cs *ConnectionState) ExportKeyingMaterial(label string, context []byte, length int) ([]byte, error)
   108  
   109  // ClientAuthTypeは、TLSクライアント認証に関するサーバーのポリシーを宣言します。
   110  type ClientAuthType int
   111  
   112  const (
   113  
   114  	// NoClientCertはハンドシェイク中にクライアント証明書を要求しないことを示し、
   115  	// 送信された証明書があっても検証されないことを意味します。
   116  	NoClientCert ClientAuthType = iota
   117  
   118  	// RequestClientCertは、ハンドシェイク中にクライアント証明書の要求を示しますが、クライアントが証明書を送信することは必要ありません。
   119  	RequestClientCert
   120  
   121  	// RequireAnyClientCertは、ハンドシェイク中にクライアント証明書を要求し、
   122  	// クライアントから少なくとも1つの証明書の送信が必要であることを示しますが、
   123  	// その証明書が有効である必要はありません。
   124  	RequireAnyClientCert
   125  
   126  	// VerifyClientCertIfGivenは、ハンドシェイク中にクライアント証明書の要求をすることを示しますが、クライアントが証明書を送信する必要はありません。ただし、クライアントが証明書を送信する場合は、その証明書が有効であることが必要です。
   127  	VerifyClientCertIfGiven
   128  
   129  	// RequireAndVerifyClientCertは、ハンドシェイク中にクライアント証明書の要求が行われることを示し、クライアントが少なくとも1つの有効な証明書を送信する必要があることを示します。
   130  	RequireAndVerifyClientCert
   131  )
   132  
   133  // ClientSessionCacheは、クライアントが特定のサーバーとTLSセッションを再開するために使用できるClientSessionStateオブジェクトのキャッシュです。ClientSessionCacheの実装は、異なるゴルーチンから同時に呼び出されることを想定しています。TLS 1.2までは、SessionIDベースの再開ではなく、チケットベースの再開のみがサポートされています。TLS 1.3では、これらがPSKモードにマージされ、このインターフェースを介してサポートされています。
   134  type ClientSessionCache interface {
   135  	Get(sessionKey string) (session *ClientSessionState, ok bool)
   136  
   137  	Put(sessionKey string, cs *ClientSessionState)
   138  }
   139  
   140  // SignatureSchemeは、TLSでサポートされる署名アルゴリズムを識別します。RFC 8446、セクション4.2.3を参照してください。
   141  type SignatureScheme uint16
   142  
   143  const (
   144  	// RSASSA-PKCS1-v1_5 アルゴリズム。
   145  	PKCS1WithSHA256 SignatureScheme = 0x0401
   146  	PKCS1WithSHA384 SignatureScheme = 0x0501
   147  	PKCS1WithSHA512 SignatureScheme = 0x0601
   148  
   149  	// 公開キーOID rsaEncryption を使用した RSASSA-PSS アルゴリズム。
   150  	PSSWithSHA256 SignatureScheme = 0x0804
   151  	PSSWithSHA384 SignatureScheme = 0x0805
   152  	PSSWithSHA512 SignatureScheme = 0x0806
   153  
   154  	// ECDSAアルゴリズム。TLS 1.3では特定の曲線に制約される。
   155  	ECDSAWithP256AndSHA256 SignatureScheme = 0x0403
   156  	ECDSAWithP384AndSHA384 SignatureScheme = 0x0503
   157  	ECDSAWithP521AndSHA512 SignatureScheme = 0x0603
   158  
   159  	// EdDSAアルゴリズム。
   160  	Ed25519 SignatureScheme = 0x0807
   161  
   162  	// TLS 1.2用の旧バージョンの署名およびハッシュアルゴリズム。
   163  	PKCS1WithSHA1 SignatureScheme = 0x0201
   164  	ECDSAWithSHA1 SignatureScheme = 0x0203
   165  )
   166  
   167  // ClientHelloInfoには、GetCertificateおよびGetConfigForClientのコールバックにおいて、
   168  // アプリケーションロジックをガイドするためのClientHelloメッセージからの情報が含まれています。
   169  type ClientHelloInfo struct {
   170  
   171  	// CipherSuitesはクライアントがサポートするCipherSuitesをリストアップしています(例:TLS_AES_128_GCM_SHA256、TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256)。
   172  	CipherSuites []uint16
   173  
   174  	// ServerNameは、クライアントがリクエストしたサーバーの名前を示します。
   175  	// 仮想ホスティングをサポートするために、クライアントがSNIを使用している場合にのみ、ServerNameが設定されます(RFC 4366、セクション3.1を参照)。
   176  	ServerName string
   177  
   178  	// SupportedCurvesはクライアントでサポートされている楕円曲線をリストアップしています。
   179  	// SupportedCurvesは、サポートされている楕円曲線拡張が使用されている場合にのみ設定されます(RFC 4492、セクション5.1.1を参照)。
   180  	SupportedCurves []CurveID
   181  
   182  	// SupportedPointsはクライアントがサポートするポイントフォーマットをリストアップしています。
   183  	// SupportedPointsは、サポートされているポイントフォーマット拡張が利用されている場合にのみ設定されます(RFC 4492、セクション5.1.2を参照)。
   184  	SupportedPoints []uint8
   185  
   186  	// SignatureSchemesは、クライアントが検証可能な署名とハッシュ方式のリストです。SignatureSchemesは、Signature Algorithms拡張が使用されている場合にのみ設定されます(RFC 5246、セクション7.4.1.4.1を参照)。
   187  	SignatureSchemes []SignatureScheme
   188  
   189  	// SupportedProtosはクライアントがサポートしているアプリケーションプロトコルのリストです。
   190  	// SupportedProtosは、アプリケーション層プロトコルネゴシエーション拡張が使用されている場合にのみ設定されます(RFC 7301、セクション3.1を参照)。
   191  	//
   192  	// サーバーは、GetConfigForClientの返り値でConfig.NextProtosを設定することでプロトコルを選択できます。
   193  	SupportedProtos []string
   194  
   195  	// SupportedVersions はクライアントでサポートされているTLSのバージョンをリストにします。
   196  	// TLSバージョン1.3未満では、これはクライアントがアドバタイズする最大のバージョンから予測されるため、最大の値以外の値は使用されると拒否される可能性があります。
   197  	SupportedVersions []uint16
   198  
   199  	// Connは接続の基礎となるnet.Connです。この接続から読み取ったり、書き込んだりしないでください。それはTLS接続の失敗を引き起こします。
   200  	Conn net.Conn
   201  
   202  	// configはGetCertificateまたはGetConfigForClientの呼び出し元で埋め込まれ、
   203  	// SupportsCertificateと共に使用されます。
   204  	config *Config
   205  
   206  	// ctxは進行中のハンドシェイクのコンテキストです。
   207  	ctx context.Context
   208  }
   209  
   210  // Contextは進行中のハンドシェイクのコンテキストを返します。
   211  // このコンテキストは、HandshakeContextに渡されたコンテキストの子孫であり、
   212  // ハンドシェイクが終了するとキャンセルされます。
   213  func (c *ClientHelloInfo) Context() context.Context
   214  
   215  // CertificateRequestInfo は、クライアントから証明書とコントロールの証明を要求するために使用される、
   216  // サーバーの CertificateRequest メッセージからの情報を含んでいます。
   217  type CertificateRequestInfo struct {
   218  
   219  	// AcceptableCAsは、ゼロまたは複数のDERエンコードされたX.501の区別名を含んでいます。これらは、サーバーが返される証明書の署名元として望むルートまたは中間CAの名前です。空のスライスは、サーバーが好みを持たないことを示します。
   220  	AcceptableCAs [][]byte
   221  
   222  	// SignatureSchemesは、サーバーが検証を行いたい署名スキームをリストアップします。
   223  	SignatureSchemes []SignatureScheme
   224  
   225  	// Versionは、この接続のために交渉されたTLSのバージョンです。
   226  	Version uint16
   227  
   228  	// ctxは進行中のハンドシェイクのコンテキストです。
   229  	ctx context.Context
   230  }
   231  
   232  // Contextは進行中のハンドシェイクのコンテキストを返します。
   233  // このコンテキストは、HandshakeContextに渡されたコンテキストの子であり、
   234  // ハンドシェイクが終了するとキャンセルされます。
   235  func (c *CertificateRequestInfo) Context() context.Context
   236  
   237  // RenegotiationSupportは、TLS renegotiationのサポートレベルを列挙しています。TLS renegotiationとは、最初の接続の後に接続で追加のhandshakeを行うことです。これにより、ステートマシンが複雑化し、多くの微妙なセキュリティ上の問題の原因となっています。再交渉の開始はサポートされていませんが、再交渉リクエストの受け入れには対応している場合があります。
   238  // 有効にされていても、サーバーはハンドシェイク間で自身の識別情報を変更することはできません(つまり、リーフ証明書は同じである必要があります)。また、同時にハンドシェイクとアプリケーションデータのフローを行うことは許可されていないため、再交渉は、再交渉と同期するプロトコル(例:HTTPS)とのみ使用できます。
   239  // 再交渉はTLS 1.3で定義されていません。
   240  type RenegotiationSupport int
   241  
   242  const (
   243  	// RenegotiateNeverは再交渉を無効にします。
   244  	RenegotiateNever RenegotiationSupport = iota
   245  
   246  	// RenegotiateOnceAsClientは、リモートサーバーに対して
   247  	// 接続ごとに再交渉を一度だけ要求することを可能にします。
   248  	RenegotiateOnceAsClient
   249  
   250  	// RenegotiateFreelyAsClientは、リモートサーバーが繰り返し再交渉を要求できるようにします。
   251  	RenegotiateFreelyAsClient
   252  )
   253  
   254  // Config構造体はTLSクライアントやサーバーを設定するために使用されます。
   255  // ConfigがTLS関数に渡された後は変更しないでください。
   256  // Configは再利用することができますが、tlsパッケージ自体は変更しません。
   257  type Config struct {
   258  
   259  	// RandはノンスやRSAブラインディングのエントロピーの源を提供します。
   260  	// もしRandがnilの場合、TLSはパッケージcrypto/randの暗号化されたランダムリーダーを使用します。
   261  	// このリーダーは複数のゴルーチンによる使用に安全である必要があります。
   262  	Rand io.Reader
   263  
   264  	// Timeはエポックからの経過秒数として現在時刻を返します。
   265  	// Timeがnilの場合、TLSはtime.Nowを使用します。
   266  	Time func() time.Time
   267  
   268  	// Certificatesは、接続の相手側に提供する1つ以上の証明書チェーンを含んでいます。相手側の要件と互換性のある最初の証明書が自動的に選択されます。
   269  	//
   270  	// サーバーの設定では、Certificates、GetCertificate、またはGetConfigForClientのいずれかを設定する必要があります。クライアント認証を行うクライアントは、CertificatesまたはGetClientCertificateのいずれかを設定することができます。
   271  	//
   272  	// 注意:複数のCertificatesがあり、オプションのLeafフィールドが設定されていない場合、証明書の選択には著しいハンドシェイクごとのパフォーマンスのコストがかかります。
   273  	Certificates []Certificate
   274  
   275  	// NameToCertificate は、証明書名を Certificates の要素にマッピングします。
   276  	// 証明書名は'*.example.com'のような形式であるため、必ずしもドメイン名である必要はありません。
   277  	//
   278  	// Deprecated: NameToCertificate では、特定の名前に対して単一の証明書の関連付けしか許可されません。
   279  	// このフィールドを nil のままにしておくと、ライブラリが Certificates から最初の互換性のあるチェーンを選択します。
   280  	NameToCertificate map[string]*Certificate
   281  
   282  	// GetCertificateは与えられたClientHelloInfoに基づいて証明書を返します。
   283  	// クライアントがSNI情報を提供する場合またはCertificatesが空の場合のみ呼び出されます。
   284  	//
   285  	// GetCertificateがnilであるかnilを返す場合、証明書はNameToCertificateから取得されます。
   286  	// NameToCertificateがnilの場合、Certificatesの最良の要素が使用されます。
   287  	//
   288  	// 一度証明書が返されたら、変更しないでください。
   289  	GetCertificate func(*ClientHelloInfo) (*Certificate, error)
   290  
   291  	// GetClientCertificateは、クライアントが証明書を要求する場合に呼び出されます。
   292  	// 設定されている場合、Certificatesの内容は無視されます。
   293  	//
   294  	// GetClientCertificateがエラーを返すと、ハンドシェイクは中止され、そのエラーが返されます。
   295  	// それ以外の場合、GetClientCertificateはnilではないCertificateを返さなければなりません。
   296  	// Certificate.Certificateが空である場合、サーバーには証明書は送信されません。
   297  	// サーバーがこれを受け入れられない場合、ハンドシェイクを中止することがあります。
   298  	//
   299  	// GetClientCertificateは、再協議が発生するか、TLS 1.3が使用されている場合に、同じ接続に対して複数回呼び出される可能性があります。
   300  	//
   301  	// 一度Certificateが返されたら、変更しないでください。
   302  	GetClientCertificate func(*CertificateRequestInfo) (*Certificate, error)
   303  
   304  	// GetConfigForClientは、クライアントからClientHelloが受信された後に呼び出されます。この接続を処理するために使用されるConfigを変更するために、非nilのConfigを返すことができます。返されたConfigがnilの場合、元のConfigが使用されます。このコールバックによって返されたConfigは、後で変更できません。
   305  	//
   306  	// GetConfigForClientがnilの場合、Server()に渡されたConfigがすべての接続に使用されます。
   307  	//
   308  	// 返されたConfigに明示的にSessionTicketKeyが設定されている場合、または返されたConfigにSetSessionTicketKeysが呼び出された場合、これらのキーが使用されます。それ以外の場合、元のConfigキーが使用されます(自動的に管理される場合、回転する可能性もあります)。
   309  	GetConfigForClient func(*ClientHelloInfo) (*Config, error)
   310  
   311  	// VerifyPeerCertificate は、TLSクライアントまたはサーバーによる通常の証明書検証の後に呼び出されます(nilでない場合)。この関数は、ピアから提供された生のASN.1証明書と、通常の処理で検証されたチェーンを受け取ります。もしnon-nilのエラーを返す場合、ハンドシェイクは中断され、そのエラーが結果となります。
   312  	// 通常の検証に失敗した場合、このコールバックは検討される前にハンドシェイクが中断されます。通常の検証が無効になっている場合(InsecureSkipVerifyがクライアント側で設定されている場合、またはServerAuthがRequestClientCertまたはRequireAnyClientCertの場合)、このコールバックは考慮されますが、verifiedChains引数は常にnilになります。ClientAuthがNoClientCertの場合、このコールバックはサーバーで呼び出されません。rawCertsは、ClientAuthがRequestClientCertまたはVerifyClientCertIfGivenの場合には、サーバーで空になる可能性があります。
   313  	// このコールバックは再開された接続では呼び出されず、証明書は再検証されません。
   314  	// verifiedChainsとその内容は変更しないでください。
   315  	VerifyPeerCertificate func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error
   316  
   317  	// VerifyConnectionは、通常の証明書の検証とVerifyPeerCertificateの後に、TLSクライアントまたはサーバーによって呼び出されます(nilではない場合)。非nilのエラーが返された場合、ハンドシェイクは中止されます。
   318  	// 通常の検証が失敗した場合、このコールバックは考慮される前にハンドシェイクが中止されます。このコールバックは、InsecureSkipVerifyまたはClientAuthの設定に関係なく、再開を含むすべての接続で実行されます。
   319  	VerifyConnection func(ConnectionState) error
   320  
   321  	// RootCAsは、クライアントがサーバー証明書を検証する際に使用するルート証明書機関のセットを定義します。
   322  	// RootCAsがnilの場合、TLSはホストのルートCAセットを使用します。
   323  	RootCAs *x509.CertPool
   324  
   325  	// NextProtosはサポートされているアプリケーションレベルのプロトコルのリストで、
   326  	// 優先順位順に表示されます。両方のピアがALPNをサポートする場合、
   327  	// 選択されるプロトコルはこのリストから選ばれ、相互にサポートされるプロトコルがない場合は接続が失敗します。
   328  	// NextProtosが空であるか、ピアがALPNをサポートしていない場合、接続は成功し、
   329  	// ConnectionState.NegotiatedProtocolは空になります。
   330  	NextProtos []string
   331  
   332  	// ServerNameは返された証明書のホスト名の検証に使用されます(InsecureSkipVerifyが指定されていない場合)。また、IPアドレスでない限り、クライアントのハンドシェイクに仮想ホスティングをサポートするために含まれます。
   333  	ServerName string
   334  
   335  	// ClientAuthは、TLSクライアント認証のサーバーポリシーを決定します。デフォルトはNoClientCertです。
   336  	ClientAuth ClientAuthType
   337  
   338  	// ClientCAsは、ClientAuthのポリシーに従って
   339  	// クライアント証明書の検証が必要な場合、
   340  	// サーバーが使用するルート証明機関のセットを定義します。
   341  	ClientCAs *x509.CertPool
   342  
   343  	// InsecureSkipVerifyは、クライアントがサーバーの証明書チェーンとホスト名を検証するかどうかを制御します。
   344  	// InsecureSkipVerifyがtrueの場合、crypto/tlsパッケージは、サーバーが提示する証明書とその証明書内の任意のホスト名を受け入れます。
   345  	// このモードでは、カスタムな検証が使用されていない限り、TLSはマンインザミドル攻撃に対して脆弱です。
   346  	// これはテスト目的でのみ使用するか、VerifyConnectionまたはVerifyPeerCertificateと組み合わせて使用する必要があります。
   347  	InsecureSkipVerify bool
   348  
   349  	// CipherSuitesは有効なTLS 1.0-1.2の暗号化スイートのリストです。リストの順序は無視されます。注意事項として、TLS 1.3の暗号スイートは設定できません。
   350  	//
   351  	// CipherSuitesがnilの場合、安全なデフォルトリストが使用されます。デフォルトの暗号スイートは
   352  	// 時間とともに変更される可能性があります。Go 1.22では、RSAキー交換ベースの暗号スイートが
   353  	// デフォルトリストから削除されましたが、GODEBUG設定のtlsrsakex=1で再追加できます。
   354  	CipherSuites []uint16
   355  
   356  	// PreferServerCipherSuitesは古いフィールドであり、効果がありません。
   357  	//
   358  	// かつて、このフィールドは、サーバーがクライアントの選好またはサーバーの選好に従うかどうかを制御していました。現在、サーバーは、推測されたクライアントのハードウェア、サーバーのハードウェア、およびセキュリティを考慮した論理に基づいて、最も相互にサポートされた暗号スイートを選択します。
   359  	//
   360  	// Deprecated: PreferServerCipherSuitesは無視されます。
   361  	PreferServerCipherSuites bool
   362  
   363  	// SessionTicketsDisabledがtrueに設定されると、セッションチケットおよびPSK(再開)のサポートが無効になります。クライアントでは、ClientSessionCacheがnilの場合もセッションチケットのサポートが無効になります。
   364  	SessionTicketsDisabled bool
   365  
   366  	// SessionTicketKeyは、セッション再開を提供するためにTLSサーバーによって使用されます。
   367  	// RFC 5077およびRFC 8446のPSKモードを参照してください。ゼロの場合、最初のサーバーハンドシェイクの前にランダムデータで埋められます。
   368  	//
   369  	// 廃止: このフィールドがゼロのままになっている場合、セッションチケットキーは自動的に毎日回転され、7日後に削除されます。
   370  	// 回転スケジュールのカスタマイズや同じホストに対して接続を終了するサーバーの同期を行う場合は、SetSessionTicketKeysを使用してください。
   371  	SessionTicketKey [32]byte
   372  
   373  	// ClientSessionCacheはTLSセッション再開のためのClientSessionStateエントリのキャッシュです。
   374  	// クライアント側でのみ使用されます。
   375  	ClientSessionCache ClientSessionCache
   376  
   377  	// UnwrapSessionは、[WrapSession]によって生成されたチケット/アイデンティティを、使用可能なセッションに変換するためにサーバー上で呼び出されます。
   378  	//
   379  	// UnwrapSessionは通常、チケット内のセッション状態を復号化するか(たとえば、[Config.EncryptTicket]を使用して)、以前に保存された状態を回復するためにチケットを使用します。セッション状態を逆シリアル化するには、[ParseSessionState]を使用する必要があります。
   380  	//
   381  	// UnwrapSessionがエラーを返した場合、接続は終了されます。(nil、nil)を返す場合、セッションは無視されます。crypto/tlsは、それでも返されたセッションを再開しないこともあります。
   382  	UnwrapSession func(identity []byte, cs ConnectionState) (*SessionState, error)
   383  
   384  	// WrapSessionはサーバーで呼び出され、セッションのチケット/アイデンティティを生成します。
   385  	//
   386  	// WrapSessionはセッションの状態を[SessionState.Bytes]でシリアライズする必要があります。
   387  	// 次に、シリアライズされた状態を暗号化する(たとえば[Config.DecryptTicket]で)または状態を保存して
   388  	// ハンドルを返すことができます。
   389  	//
   390  	// WrapSessionがエラーを返すと、接続は終了します。
   391  	//
   392  	// 警告:返り値は平文でワイヤー上やクライアントに公開されます。
   393  	// アプリケーションはそれを暗号化し、認証する(およびキーをローテーションする)
   394  	// または高エントロピーの識別子を返すことが責任です。
   395  	// 正しく行わないと、現在の接続や以前の接続、将来の接続が妥協される可能性があります。
   396  	//
   397  	WrapSession func(ConnectionState, *SessionState) ([]byte, error)
   398  
   399  	// MinVersionには受け入れ可能な最小のTLSバージョンが含まれています。
   400  	//
   401  	// デフォルトでは、現在TLS 1.2が最小限として使用されています。TLS 1.0は、
   402  	// このパッケージがサポートする最小限です。
   403  	//
   404  	// サーバーサイドのデフォルトは、GODEBUG環境変数に値
   405  	// "tls10server=1"を含めることでTLS 1.0に戻すことができます。
   406  	MinVersion uint16
   407  
   408  	// MaxVersionには許容される最大のTLSバージョンが含まれています。
   409  	//
   410  	// デフォルトでは、このパッケージでサポートされている最大バージョンが使用されます。
   411  	// 現在のバージョンはTLS 1.3です。
   412  	MaxVersion uint16
   413  
   414  	// CurvePreferencesには、ECDHEハンドシェイクで使用される楕円曲線が好まれる順に含まれます。空の場合、デフォルトが使用されます。クライアントは、TLS 1.3でキーシェアのタイプとして最初の選択肢を使用します。将来的には、これは変更される可能性があります。
   415  	CurvePreferences []CurveID
   416  
   417  	// DynamicRecordSizingDisabledはTLSレコードの適応的なサイズ調整を無効にします。
   418  	// trueの場合、常に最大のTLSレコードサイズが使用されます。falseの場合、
   419  	// TLSレコードのサイズはレイテンシを改善するために調整されることがあります。
   420  	DynamicRecordSizingDisabled bool
   421  
   422  	// Renegotiationは、再交渉がサポートされるタイプを制御します。
   423  	// デフォルトの「なし」は、ほとんどのアプリケーションにとって正しいです。
   424  	Renegotiation RenegotiationSupport
   425  
   426  	// KeyLogWriterは、TLSのマスターシークレットの宛先として使用できる、NSSキーログ形式の外部プログラム(Wiresharkなど)によるTLS接続の復号化を許可するためのオプションです。
   427  	// https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/Key_Log_Formatを参照してください。
   428  	// KeyLogWriterの使用はセキュリティを損なう可能性があり、デバッグ目的のみに使用するべきです。
   429  	KeyLogWriter io.Writer
   430  
   431  	// mutexはsessionTicketKeysとautoSessionTicketKeysを保護しています。
   432  	mutex sync.RWMutex
   433  
   434  	// sessionTicketKeysには、ゼロ個以上のチケットキーが含まれています。
   435  	// 設定されている場合、それはSessionTicketKeyまたはSetSessionTicketKeysでキーが設定されたことを意味します。
   436  	// 最初のキーは新しいチケットに使用され、後続のキーは古いチケットの復号に使用できます。
   437  	// スライスの内容はミューテックスで保護されず、変更不可です。
   438  	sessionTicketKeys []ticketKey
   439  
   440  	// autoSessionTicketKeysはsessionTicketKeysと似ていますが、自動回転ロジックによって所有されています。Config.ticketKeysを参照してください。
   441  	autoSessionTicketKeys []ticketKey
   442  }
   443  
   444  // Cloneはcの浅いクローンを返します。cがnilの場合はnilを返します。TLSクライアントやサーバーによって
   445  // 同時に使用されている [Config] をクローンすることは安全です。
   446  func (c *Config) Clone() *Config
   447  
   448  // SetSessionTicketKeysはサーバーのセッションチケットのキーを更新します。
   449  //
   450  // 新しいチケットを作成する際に最初のキーが使用され、すべてのキーはチケットの解読に使用できます。
   451  // セッションチケットのキーをローテーションするために、この関数を実行しても問題ありません(サーバーが実行中である場合)。
   452  // 関数はキーが空の場合、パニックを発生させます。
   453  //
   454  // この関数を呼び出すと、自動的なセッションチケットキーのローテーションが無効になります。
   455  //
   456  // 同じホストに接続を終了する複数のサーバーがある場合、すべてのサーバーは同じセッションチケットのキーを持つ必要があります。
   457  // セッションチケットのキーが漏洩した場合、以前に記録されたおよび将来のTLS接続でこれらのキーが使用される可能性があります。
   458  // これにより、接続が危険にさらされる可能性があります。
   459  func (c *Config) SetSessionTicketKeys(keys [][32]byte)
   460  
   461  // SupportsCertificateは、提供された証明書が
   462  // ClientHelloを送信したクライアントによってサポートされている場合にはnilを返します。そうでない場合は、互換性のない理由を説明するエラーを返します。
   463  //
   464  // この [ClientHelloInfo] がGetConfigForClientまたはGetCertificateコールバックに渡された場合、このメソッドは関連する [Config] を考慮に入れます。ただし、GetConfigForClientが異なる [Config] を返す場合、このメソッドでは変更を考慮することができません。
   465  //
   466  // c.Leafが設定されていない場合、この関数はx509.ParseCertificateを呼び出しますが、それはかなりのパフォーマンスコストを伴うことになります。
   467  func (chi *ClientHelloInfo) SupportsCertificate(c *Certificate) error
   468  
   469  // SupportsCertificateは、提供された証明書がCertificateRequestを送信したサーバーによってサポートされている場合はnilを返します。それ以外の場合、非互換性の理由を説明するエラーが返されます。
   470  func (cri *CertificateRequestInfo) SupportsCertificate(c *Certificate) error
   471  
   472  // BuildNameToCertificateはc.Certificatesを解析し、各リーフ証明書のCommonNameとSubjectAlternateNameフィールドからc.NameToCertificateを構築します。
   473  // 廃止されました: NameToCertificateは特定の名前に対して単一の証明書の関連付けしか許可しません。そのフィールドをnilのままにしておき、ライブラリに最初に互換性のあるチェーンを選択させます。
   474  func (c *Config) BuildNameToCertificate()
   475  
   476  // ボタン構造体は、最初にリーフ(最下位)のボタンから始まり、その上位にある1つ以上のボタンのチェーンです。
   477  type Certificate struct {
   478  	Certificate [][]byte
   479  
   480  	// PrivateKeyは、Leafの公開鍵に対応する秘密鍵を含んでいます。
   481  	// これは、RSA、ECDSA、またはEd25519 PublicKeyを使用してcrypto.Signerを実装する必要があります。
   482  	// TLS 1.2までのサーバーの場合、RSA PublicKeyを使用してcrypto.Decrypterも実装できます。
   483  	PrivateKey crypto.PrivateKey
   484  
   485  	// SupportedSignatureAlgorithmsは、PrivateKeyが使用できる署名アルゴリズムを制限するオプションのリストです。
   486  	SupportedSignatureAlgorithms []SignatureScheme
   487  
   488  	// OCSPStapleには、リクエストするクライアントに提供されるオプションのOCSP応答が含まれています。
   489  	OCSPStaple []byte
   490  
   491  	// SignedCertificateTimestampsには、要求するクライアントに提供されるオプションの署名付き証明書タイムスタンプのリストが含まれています。
   492  	SignedCertificateTimestamps [][]byte
   493  
   494  	// Leafは、パースされたリーフ証明書の形式であり、x509.ParseCertificateを使用して初期化することができます。
   495  	// デフォルトではnilである場合、リーフ証明書は必要に応じてパースされます。
   496  	Leaf *x509.Certificate
   497  }
   498  
   499  // NewLRUClientSessionCacheは、与えられた容量を使用してLRU戦略を採用した [ClientSessionCache] を返します。容量が1未満の場合、代わりにデフォルトの容量が使用されます。
   500  func NewLRUClientSessionCache(capacity int) ClientSessionCache
   501  
   502  // CertificateVerificationError は、ハンドシェイク中に証明書の検証が失敗した場合に返されます。
   503  type CertificateVerificationError struct {
   504  	// UnverifiedCertificatesおよびその内容は変更しないでください。
   505  	UnverifiedCertificates []*x509.Certificate
   506  	Err                    error
   507  }
   508  
   509  func (e *CertificateVerificationError) Error() string
   510  
   511  func (e *CertificateVerificationError) Unwrap() error