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