Documentation
¶
Overview ¶
tlsパッケージは、RFC 5246で指定されているTLS 1.2と、RFC 8446で指定されているTLS 1.3を部分的に実装しています。
Index ¶
- Constants
- func CipherSuiteName(id uint16) string
- func Listen(network, laddr string, config *Config) (net.Listener, error)
- func NewListener(inner net.Listener, config *Config) net.Listener
- func VersionName(version uint16) string
- type AlertError
- type Certificate
- type CertificateRequestInfo
- type CertificateVerificationError
- type CipherSuite
- type ClientAuthType
- type ClientHelloInfo
- type ClientSessionCache
- type ClientSessionState
- type Config
- func (c *Config) BuildNameToCertificate()
- func (c *Config) Clone() *Config
- func (c *Config) DecryptTicket(identity []byte, cs ConnectionState) (*SessionState, error)
- func (c *Config) EncryptTicket(cs ConnectionState, ss *SessionState) ([]byte, error)
- func (c *Config) SetSessionTicketKeys(keys [][32]byte)
- type Conn
- func (c *Conn) Close() error
- func (c *Conn) CloseWrite() error
- func (c *Conn) ConnectionState() ConnectionState
- func (c *Conn) Handshake() error
- func (c *Conn) HandshakeContext(ctx context.Context) error
- func (c *Conn) LocalAddr() net.Addr
- func (c *Conn) NetConn() net.Conn
- func (c *Conn) OCSPResponse() []byte
- func (c *Conn) Read(b []byte) (int, error)
- func (c *Conn) RemoteAddr() net.Addr
- func (c *Conn) SetDeadline(t time.Time) error
- func (c *Conn) SetReadDeadline(t time.Time) error
- func (c *Conn) SetWriteDeadline(t time.Time) error
- func (c *Conn) VerifyHostname(host string) error
- func (c *Conn) Write(b []byte) (int, error)
- type ConnectionState
- type CurveID
- type Dialer
- type ECHRejectionError
- type QUICConfig
- type QUICConn
- func (q *QUICConn) Close() error
- func (q *QUICConn) ConnectionState() ConnectionState
- func (q *QUICConn) HandleData(level QUICEncryptionLevel, data []byte) error
- func (q *QUICConn) NextEvent() QUICEvent
- func (q *QUICConn) SendSessionTicket(opts QUICSessionTicketOptions) error
- func (q *QUICConn) SetTransportParameters(params []byte)
- func (q *QUICConn) Start(ctx context.Context) error
- func (q *QUICConn) StoreSession(session *SessionState) error
- type QUICEncryptionLevel
- type QUICEvent
- type QUICEventKind
- type QUICSessionTicketOptions
- type RecordHeaderError
- type RenegotiationSupport
- type SessionState
- type SignatureScheme
Examples ¶
Constants ¶
const ( // TLS 1.0 - 1.2の暗号スイート。 TLS_RSA_WITH_RC4_128_SHA uint16 = 0x0005 TLS_RSA_WITH_3DES_EDE_CBC_SHA uint16 = 0x000a TLS_RSA_WITH_AES_128_CBC_SHA uint16 = 0x002f TLS_RSA_WITH_AES_256_CBC_SHA uint16 = 0x0035 TLS_RSA_WITH_AES_128_CBC_SHA256 uint16 = 0x003c TLS_RSA_WITH_AES_128_GCM_SHA256 uint16 = 0x009c TLS_RSA_WITH_AES_256_GCM_SHA384 uint16 = 0x009d TLS_ECDHE_ECDSA_WITH_RC4_128_SHA uint16 = 0xc007 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA uint16 = 0xc009 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA uint16 = 0xc00a TLS_ECDHE_RSA_WITH_RC4_128_SHA uint16 = 0xc011 TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA uint16 = 0xc012 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA uint16 = 0xc013 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA uint16 = 0xc014 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 uint16 = 0xc023 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 uint16 = 0xc027 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 uint16 = 0xc02f TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 uint16 = 0xc02b TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 uint16 = 0xc030 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 uint16 = 0xc02c TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 uint16 = 0xcca8 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 uint16 = 0xcca9 // TLS 1.3サイファースイート。 TLS_AES_128_GCM_SHA256 uint16 = 0x1301 TLS_AES_256_GCM_SHA384 uint16 = 0x1302 TLS_CHACHA20_POLY1305_SHA256 uint16 = 0x1303 // TLS_FALLBACK_SCSVは標準の暗号スイートではなく、クライアントがバージョンのフォールバックを行っていることを示すものです。RFC 7507を参照してください。 TLS_FALLBACK_SCSV uint16 = 0x5600 // 正しい_SHA256サフィックスを持つ対応する暗号スイートのためのレガシー名前 // 互換性のために保持されています。 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 = TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 = TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 )
このパッケージで実装されている、または実装されていた暗号スイートのIDのリストです。
詳細は、https://www.iana.org/assignments/tls-parameters/tls-parameters.xml を参照してください。
const ( VersionTLS10 = 0x0301 VersionTLS11 = 0x0302 VersionTLS12 = 0x0303 VersionTLS13 = 0x0304 // Deprecated: SSLv3は暗号的に破損しており、 // このパッケージではサポートされていません。golang.org/issue/32716を参照してください。 VersionSSL30 = 0x0300 )
const ( QUICEncryptionLevelInitial = QUICEncryptionLevel(iota) QUICEncryptionLevelEarly QUICEncryptionLevelHandshake QUICEncryptionLevelApplication )
Variables ¶
This section is empty.
Functions ¶
func CipherSuiteName ¶ added in v1.14.0
CipherSuiteNameは渡された暗号スイートIDの標準名 (例:「TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256」)を返します。 もしこのパッケージで暗号スイートが実装されていない場合は、IDの値をフォールバック表現として返します。
func Listen ¶
Listenは、net.Listenを使用して、指定されたネットワークアドレスで接続を受け入れるTLSリスナーを作成します。 設定(config)は、nil以外である必要があり、少なくとも1つの証明書を含んでいるか、GetCertificateを設定している必要があります。
func NewListener ¶
NewListenerは、内部Listenerからの接続を受け入れ、それぞれの接続を Server でラップするListenerを作成します。 設定configはnilではなく、少なくとも1つの証明書を含むか、それ以外の場合はGetCertificateを設定する必要があります。
func VersionName ¶ added in v1.21.0
VersionNameは提供されたTLSバージョン番号の名前(例:"TLS 1.3")を返します。 もしバージョンがこのパッケージで実装されていない場合は、値のフォールバック表現を返します。
Types ¶
type AlertError ¶ added in v1.21.0
type AlertError uint8
AlertErrorはTLSアラートです。
QUICトランスポートを使用する場合、QUICConnのメソッドは TLSアラートを送信する代わりにAlertErrorをラップしたエラーを返します。
func (AlertError) Error ¶ added in v1.21.0
func (e AlertError) Error() string
type Certificate ¶
type Certificate struct { Certificate [][]byte // PrivateKeyは、Leafの公開鍵に対応する秘密鍵を含んでいます。 // これは、RSA、ECDSA、またはEd25519 PublicKeyを使用してcrypto.Signerを実装する必要があります。 // TLS 1.2までのサーバーの場合、RSA PublicKeyを使用してcrypto.Decrypterも実装できます。 PrivateKey crypto.PrivateKey // SupportedSignatureAlgorithmsは、PrivateKeyが使用できる署名アルゴリズムを制限するオプションのリストです。 SupportedSignatureAlgorithms []SignatureScheme // OCSPStapleには、リクエストするクライアントに提供されるオプションのOCSP応答が含まれています。 OCSPStaple []byte // SignedCertificateTimestampsには、要求するクライアントに提供されるオプションの署名付き証明書タイムスタンプのリストが含まれています。 SignedCertificateTimestamps [][]byte // Leafは、パースされたリーフ証明書の形式であり、x509.ParseCertificateを使用して初期化することができます。 // デフォルトではnilである場合、リーフ証明書は必要に応じてパースされます。 Leaf *x509.Certificate }
ボタン構造体は、最初にリーフ(最下位)のボタンから始まり、その上位にある1つ以上のボタンのチェーンです。
func LoadX509KeyPair ¶
func LoadX509KeyPair(certFile, keyFile string) (Certificate, error)
LoadX509KeyPairは、ペアのファイルから公開/秘密鍵ペアを読み込んで解析します。 ファイルにはPEMエンコードされたデータが含まれている必要があります。証明書ファイルには、 リーフ証明書に続く中間証明書が含まれている場合があり、証明書チェーンを形成します。 成功時の戻り値では、Certificate.Leafが設定されます。
Go 1.23以前ではCertificate.Leafはnilのままで、解析された証明書は破棄されました。 この挙動は、GODEBUG環境変数で"x509keypairleaf=0"を設定することで再度有効にすることができます。
Example ¶
package main import ( "github.com/shogo82148/std/crypto/tls" "github.com/shogo82148/std/log" ) func main() { cert, err := tls.LoadX509KeyPair("testdata/example-cert.pem", "testdata/example-key.pem") if err != nil { log.Fatal(err) } cfg := &tls.Config{Certificates: []tls.Certificate{cert}} listener, err := tls.Listen("tcp", ":2000", cfg) if err != nil { log.Fatal(err) } _ = listener }
Output:
func X509KeyPair ¶
func X509KeyPair(certPEMBlock, keyPEMBlock []byte) (Certificate, error)
X509KeyPairは、ペアのPEMエンコードされたデータから公開/秘密鍵ペアを解析します。成功時の戻り値では、Certificate.Leafが設定されます。
Go 1.23以前ではCertificate.Leafはnilのままで、解析された証明書は破棄されました。この挙動は、GODEBUG環境変数で"x509keypairleaf=0" を設定することで再度有効にすることができます。
Example ¶
package main import ( "github.com/shogo82148/std/crypto/tls" "github.com/shogo82148/std/log" ) func main() { certPem := []byte(`-----BEGIN CERTIFICATE----- MIIBhTCCASugAwIBAgIQIRi6zePL6mKjOipn+dNuaTAKBggqhkjOPQQDAjASMRAw DgYDVQQKEwdBY21lIENvMB4XDTE3MTAyMDE5NDMwNloXDTE4MTAyMDE5NDMwNlow EjEQMA4GA1UEChMHQWNtZSBDbzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABD0d 7VNhbWvZLWPuj/RtHFjvtJBEwOkhbN/BnnE8rnZR8+sbwnc/KhCk3FhnpHZnQz7B 5aETbbIgmuvewdjvSBSjYzBhMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggr BgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdEQQiMCCCDmxvY2FsaG9zdDo1 NDUzgg4xMjcuMC4wLjE6NTQ1MzAKBggqhkjOPQQDAgNIADBFAiEA2zpJEPQyz6/l Wf86aX6PepsntZv2GYlA5UpabfT2EZICICpJ5h/iI+i341gBmLiAFQOyTDT+/wQc 6MF9+Yw1Yy0t -----END CERTIFICATE-----`) keyPem := []byte(`-----BEGIN EC PRIVATE KEY----- MHcCAQEEIIrYSSNQFaA2Hwf1duRSxKtLYX5CB04fSeQ6tF1aY/PuoAoGCCqGSM49 AwEHoUQDQgAEPR3tU2Fta9ktY+6P9G0cWO+0kETA6SFs38GecTyudlHz6xvCdz8q EKTcWGekdmdDPsHloRNtsiCa697B2O9IFA== -----END EC PRIVATE KEY-----`) cert, err := tls.X509KeyPair(certPem, keyPem) if err != nil { log.Fatal(err) } cfg := &tls.Config{Certificates: []tls.Certificate{cert}} listener, err := tls.Listen("tcp", ":2000", cfg) if err != nil { log.Fatal(err) } _ = listener }
Output:
Example (HttpServer) ¶
package main import ( "github.com/shogo82148/std/crypto/tls" "github.com/shogo82148/std/log" "github.com/shogo82148/std/net/http" "github.com/shogo82148/std/time" ) func main() { certPem := []byte(`-----BEGIN CERTIFICATE----- MIIBhTCCASugAwIBAgIQIRi6zePL6mKjOipn+dNuaTAKBggqhkjOPQQDAjASMRAw DgYDVQQKEwdBY21lIENvMB4XDTE3MTAyMDE5NDMwNloXDTE4MTAyMDE5NDMwNlow EjEQMA4GA1UEChMHQWNtZSBDbzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABD0d 7VNhbWvZLWPuj/RtHFjvtJBEwOkhbN/BnnE8rnZR8+sbwnc/KhCk3FhnpHZnQz7B 5aETbbIgmuvewdjvSBSjYzBhMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggr BgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdEQQiMCCCDmxvY2FsaG9zdDo1 NDUzgg4xMjcuMC4wLjE6NTQ1MzAKBggqhkjOPQQDAgNIADBFAiEA2zpJEPQyz6/l Wf86aX6PepsntZv2GYlA5UpabfT2EZICICpJ5h/iI+i341gBmLiAFQOyTDT+/wQc 6MF9+Yw1Yy0t -----END CERTIFICATE-----`) keyPem := []byte(`-----BEGIN EC PRIVATE KEY----- MHcCAQEEIIrYSSNQFaA2Hwf1duRSxKtLYX5CB04fSeQ6tF1aY/PuoAoGCCqGSM49 AwEHoUQDQgAEPR3tU2Fta9ktY+6P9G0cWO+0kETA6SFs38GecTyudlHz6xvCdz8q EKTcWGekdmdDPsHloRNtsiCa697B2O9IFA== -----END EC PRIVATE KEY-----`) cert, err := tls.X509KeyPair(certPem, keyPem) if err != nil { log.Fatal(err) } cfg := &tls.Config{Certificates: []tls.Certificate{cert}} srv := &http.Server{ TLSConfig: cfg, ReadTimeout: time.Minute, WriteTimeout: time.Minute, } log.Fatal(srv.ListenAndServeTLS("", "")) }
Output:
type CertificateRequestInfo ¶ added in v1.8.0
type CertificateRequestInfo struct { // AcceptableCAsは、ゼロまたは複数のDERエンコードされたX.501の区別名を含んでいます。これらは、サーバーが返される証明書の署名元として望むルートまたは中間CAの名前です。空のスライスは、サーバーが好みを持たないことを示します。 AcceptableCAs [][]byte // SignatureSchemesは、サーバーが検証を行いたい署名スキームをリストアップします。 SignatureSchemes []SignatureScheme // Versionは、この接続のために交渉されたTLSのバージョンです。 Version uint16 // contains filtered or unexported fields }
CertificateRequestInfo は、クライアントから証明書とコントロールの証明を要求するために使用される、 サーバーの CertificateRequest メッセージからの情報を含んでいます。
func (*CertificateRequestInfo) Context ¶ added in v1.17.0
func (c *CertificateRequestInfo) Context() context.Context
Contextは進行中のハンドシェイクのコンテキストを返します。 このコンテキストは、HandshakeContextに渡されたコンテキストの子であり、 ハンドシェイクが終了するとキャンセルされます。
func (*CertificateRequestInfo) SupportsCertificate ¶ added in v1.14.0
func (cri *CertificateRequestInfo) SupportsCertificate(c *Certificate) error
SupportsCertificateは、提供された証明書がCertificateRequestを送信したサーバーによってサポートされている場合はnilを返します。それ以外の場合、非互換性の理由を説明するエラーが返されます。
type CertificateVerificationError ¶ added in v1.20.0
type CertificateVerificationError struct { // UnverifiedCertificatesおよびその内容は変更しないでください。 UnverifiedCertificates []*x509.Certificate Err error }
CertificateVerificationError は、ハンドシェイク中に証明書の検証が失敗した場合に返されます。
func (*CertificateVerificationError) Error ¶ added in v1.20.0
func (e *CertificateVerificationError) Error() string
func (*CertificateVerificationError) Unwrap ¶ added in v1.20.0
func (e *CertificateVerificationError) Unwrap() error
type CipherSuite ¶ added in v1.14.0
type CipherSuite struct { ID uint16 Name string // Supported versionsは、この暗号スイートをネゴシエートできるTLSプロトコルのバージョンのリストです。 SupportedVersions []uint16 // Insecureは、そのプリミティブ、設計、または実装による既知のセキュリティ問題があるため、暗号スイートが安全ではない場合にtrueとなります。 Insecure bool }
CipherSuiteはTLSの暗号スイートです。このパッケージのほとんどの関数は、この型の代わりに暗号スイートのIDを受け入れて公開します。
func CipherSuites ¶ added in v1.14.0
func CipherSuites() []*CipherSuite
CipherSuitesは、このパッケージで現在実装されている暗号スイートのリストを返します。 ただし、セキュリティ上の問題があるものは InsecureCipherSuites によって返されます。
このリストはIDでソートされています。このパッケージによって選択されるデフォルトの暗号スイートが、 静的なリストでは捉えることができないロジックに依存している場合があり、 この関数によって返されるものと一致しない場合があります。
func InsecureCipherSuites ¶ added in v1.14.0
func InsecureCipherSuites() []*CipherSuite
InsecureCipherSuitesは、現在このパッケージで実装されているセキュリティ上の問題を抱えた暗号スイートのリストを返します。 ほとんどのアプリケーションは、このリストに含まれる暗号スイートを使用すべきではありません。代わりに、 CipherSuites で返されるスイートのみを使用するべきです。
type ClientAuthType ¶
type ClientAuthType int
ClientAuthTypeは、TLSクライアント認証に関するサーバーのポリシーを宣言します。
const ( // NoClientCertはハンドシェイク中にクライアント証明書を要求しないことを示し、 // 送信された証明書があっても検証されないことを意味します。 NoClientCert ClientAuthType = iota // RequestClientCertは、ハンドシェイク中にクライアント証明書の要求を示しますが、クライアントが証明書を送信することは必要ありません。 RequestClientCert // RequireAnyClientCertは、ハンドシェイク中にクライアント証明書を要求し、 // クライアントから少なくとも1つの証明書の送信が必要であることを示しますが、 // その証明書が有効である必要はありません。 RequireAnyClientCert // VerifyClientCertIfGivenは、ハンドシェイク中にクライアント証明書の要求をすることを示しますが、クライアントが証明書を送信する必要はありません。ただし、クライアントが証明書を送信する場合は、その証明書が有効であることが必要です。 VerifyClientCertIfGiven // RequireAndVerifyClientCertは、ハンドシェイク中にクライアント証明書の要求が行われることを示し、クライアントが少なくとも1つの有効な証明書を送信する必要があることを示します。 RequireAndVerifyClientCert )
func (ClientAuthType) String ¶ added in v1.15.0
func (i ClientAuthType) String() string
type ClientHelloInfo ¶ added in v1.4.0
type ClientHelloInfo struct { // CipherSuitesはクライアントがサポートするCipherSuitesをリストアップしています(例:TLS_AES_128_GCM_SHA256、TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256)。 CipherSuites []uint16 // ServerNameは、クライアントがリクエストしたサーバーの名前を示します。 // 仮想ホスティングをサポートするために、クライアントがSNIを使用している場合にのみ、ServerNameが設定されます(RFC 4366、セクション3.1を参照)。 ServerName string // SupportedCurvesはクライアントでサポートされている楕円曲線をリストアップしています。 // SupportedCurvesは、サポートされている楕円曲線拡張が使用されている場合にのみ設定されます(RFC 4492、セクション5.1.1を参照)。 SupportedCurves []CurveID // SupportedPointsはクライアントがサポートするポイントフォーマットをリストアップしています。 // SupportedPointsは、サポートされているポイントフォーマット拡張が利用されている場合にのみ設定されます(RFC 4492、セクション5.1.2を参照)。 SupportedPoints []uint8 // SignatureSchemesは、クライアントが検証可能な署名とハッシュ方式のリストです。SignatureSchemesは、Signature Algorithms拡張が使用されている場合にのみ設定されます(RFC 5246、セクション7.4.1.4.1を参照)。 SignatureSchemes []SignatureScheme // SupportedProtosはクライアントがサポートしているアプリケーションプロトコルのリストです。 // SupportedProtosは、アプリケーション層プロトコルネゴシエーション拡張が使用されている場合にのみ設定されます(RFC 7301、セクション3.1を参照)。 // // サーバーは、GetConfigForClientの返り値でConfig.NextProtosを設定することでプロトコルを選択できます。 SupportedProtos []string // SupportedVersions はクライアントでサポートされているTLSのバージョンをリストにします。 // TLSバージョン1.3未満では、これはクライアントがアドバタイズする最大のバージョンから予測されるため、最大の値以外の値は使用されると拒否される可能性があります。 SupportedVersions []uint16 // Extensions lists the IDs of the extensions presented by the client // in the client hello. Extensions []uint16 // Connは接続の基礎となるnet.Connです。この接続から読み取ったり、書き込んだりしないでください。それはTLS接続の失敗を引き起こします。 Conn net.Conn // contains filtered or unexported fields }
ClientHelloInfoには、GetCertificateおよびGetConfigForClientのコールバックにおいて、 アプリケーションロジックをガイドするためのClientHelloメッセージからの情報が含まれています。
func (*ClientHelloInfo) Context ¶ added in v1.17.0
func (c *ClientHelloInfo) Context() context.Context
Contextは進行中のハンドシェイクのコンテキストを返します。 このコンテキストは、HandshakeContextに渡されたコンテキストの子孫であり、 ハンドシェイクが終了するとキャンセルされます。
func (*ClientHelloInfo) SupportsCertificate ¶ added in v1.14.0
func (chi *ClientHelloInfo) SupportsCertificate(c *Certificate) error
SupportsCertificateは、提供された証明書が ClientHelloを送信したクライアントによってサポートされている場合にはnilを返します。そうでない場合は、互換性のない理由を説明するエラーを返します。
この ClientHelloInfo がGetConfigForClientまたはGetCertificateコールバックに渡された場合、このメソッドは関連する Config を考慮に入れます。ただし、GetConfigForClientが異なる Config を返す場合、このメソッドでは変更を考慮することができません。
c.Leafが設定されていない場合、この関数はx509.ParseCertificateを呼び出しますが、それはかなりのパフォーマンスコストを伴うことになります。
type ClientSessionCache ¶ added in v1.3.0
type ClientSessionCache interface { Get(sessionKey string) (session *ClientSessionState, ok bool) Put(sessionKey string, cs *ClientSessionState) }
ClientSessionCacheは、クライアントが特定のサーバーとTLSセッションを再開するために使用できるClientSessionStateオブジェクトのキャッシュです。ClientSessionCacheの実装は、異なるゴルーチンから同時に呼び出されることを想定しています。TLS 1.2までは、SessionIDベースの再開ではなく、チケットベースの再開のみがサポートされています。TLS 1.3では、これらがPSKモードにマージされ、このインターフェースを介してサポートされています。
func NewLRUClientSessionCache ¶ added in v1.3.0
func NewLRUClientSessionCache(capacity int) ClientSessionCache
NewLRUClientSessionCacheは、与えられた容量を使用してLRU戦略を採用した ClientSessionCache を返します。容量が1未満の場合、代わりにデフォルトの容量が使用されます。
type ClientSessionState ¶ added in v1.3.0
type ClientSessionState struct {
// contains filtered or unexported fields
}
ClientSessionState は、クライアントが前のTLSセッションを再開するために必要な状態を含んでいます。
func NewResumptionState ¶ added in v1.21.0
func NewResumptionState(ticket []byte, state *SessionState) (*ClientSessionState, error)
NewResumptionStateは、前のセッションを再開するために[ClientSessionCache.Get]によって返されるstate値を返します。
stateは[ParseSessionState]によって返される必要があり、ticketとsessionの状態は[ClientSessionState.ResumptionState]によって返される必要があります。
func (*ClientSessionState) ResumptionState ¶ added in v1.21.0
func (cs *ClientSessionState) ResumptionState() (ticket []byte, state *SessionState, err error)
ResumptionStateは、サーバーが送信したセッションチケット(セッションの識別子としても知られている)と、このセッションを再開するために必要な状態を返します。
[ClientSessionCache.Put]によって呼び出され、セッションをシリアル化([SessionState.Bytes]を使用)して保存することができます。
type Config ¶
type Config struct { // RandはノンスやRSAブラインディングのエントロピーの源を提供します。 // もしRandがnilの場合、TLSはパッケージcrypto/randの暗号化されたランダムリーダーを使用します。 // このリーダーは複数のゴルーチンによる使用に安全である必要があります。 Rand io.Reader // Timeはエポックからの経過秒数として現在時刻を返します。 // Timeがnilの場合、TLSはtime.Nowを使用します。 Time func() time.Time // Certificatesは、接続の相手側に提供する1つ以上の証明書チェーンを含んでいます。相手側の要件と互換性のある最初の証明書が自動的に選択されます。 // // サーバーの設定では、Certificates、GetCertificate、またはGetConfigForClientのいずれかを設定する必要があります。クライアント認証を行うクライアントは、CertificatesまたはGetClientCertificateのいずれかを設定することができます。 // // 注意:複数のCertificatesがあり、オプションのLeafフィールドが設定されていない場合、証明書の選択には著しいハンドシェイクごとのパフォーマンスのコストがかかります。 Certificates []Certificate // NameToCertificate は、証明書名を Certificates の要素にマッピングします。 // 証明書名は'*.example.com'のような形式であるため、必ずしもドメイン名である必要はありません。 // // Deprecated: NameToCertificate では、特定の名前に対して単一の証明書の関連付けしか許可されません。 // このフィールドを nil のままにしておくと、ライブラリが Certificates から最初の互換性のあるチェーンを選択します。 NameToCertificate map[string]*Certificate // GetCertificateは与えられたClientHelloInfoに基づいて証明書を返します。 // クライアントがSNI情報を提供する場合またはCertificatesが空の場合のみ呼び出されます。 // // GetCertificateがnilであるかnilを返す場合、証明書はNameToCertificateから取得されます。 // NameToCertificateがnilの場合、Certificatesの最良の要素が使用されます。 // // 一度証明書が返されたら、変更しないでください。 GetCertificate func(*ClientHelloInfo) (*Certificate, error) // GetClientCertificateは、クライアントが証明書を要求する場合に呼び出されます。 // 設定されている場合、Certificatesの内容は無視されます。 // // GetClientCertificateがエラーを返すと、ハンドシェイクは中止され、そのエラーが返されます。 // それ以外の場合、GetClientCertificateはnilではないCertificateを返さなければなりません。 // Certificate.Certificateが空である場合、サーバーには証明書は送信されません。 // サーバーがこれを受け入れられない場合、ハンドシェイクを中止することがあります。 // // GetClientCertificateは、再協議が発生するか、TLS 1.3が使用されている場合に、同じ接続に対して複数回呼び出される可能性があります。 // // 一度Certificateが返されたら、変更しないでください。 GetClientCertificate func(*CertificateRequestInfo) (*Certificate, error) // GetConfigForClientは、クライアントからClientHelloが受信された後に呼び出されます。この接続を処理するために使用されるConfigを変更するために、非nilのConfigを返すことができます。返されたConfigがnilの場合、元のConfigが使用されます。このコールバックによって返されたConfigは、後で変更できません。 // // GetConfigForClientがnilの場合、Server()に渡されたConfigがすべての接続に使用されます。 // // 返されたConfigに明示的にSessionTicketKeyが設定されている場合、または返されたConfigにSetSessionTicketKeysが呼び出された場合、これらのキーが使用されます。それ以外の場合、元のConfigキーが使用されます(自動的に管理される場合、回転する可能性もあります)。 GetConfigForClient func(*ClientHelloInfo) (*Config, error) // VerifyPeerCertificate は、TLSクライアントまたはサーバーによる通常の証明書検証の後に呼び出されます(nilでない場合)。この関数は、ピアから提供された生のASN.1証明書と、通常の処理で検証されたチェーンを受け取ります。もしnon-nilのエラーを返す場合、ハンドシェイクは中断され、そのエラーが結果となります。 // 通常の検証に失敗した場合、このコールバックは検討される前にハンドシェイクが中断されます。通常の検証が無効になっている場合(InsecureSkipVerifyがクライアント側で設定されている場合、またはServerAuthがRequestClientCertまたはRequireAnyClientCertの場合)、このコールバックは考慮されますが、verifiedChains引数は常にnilになります。ClientAuthがNoClientCertの場合、このコールバックはサーバーで呼び出されません。rawCertsは、ClientAuthがRequestClientCertまたはVerifyClientCertIfGivenの場合には、サーバーで空になる可能性があります。 // このコールバックは再開された接続では呼び出されず、証明書は再検証されません。 // verifiedChainsとその内容は変更しないでください。 VerifyPeerCertificate func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error // VerifyConnectionは、通常の証明書の検証とVerifyPeerCertificateの後に、TLSクライアントまたはサーバーによって呼び出されます(nilではない場合)。非nilのエラーが返された場合、ハンドシェイクは中止されます。 // 通常の検証が失敗した場合、このコールバックは考慮される前にハンドシェイクが中止されます。このコールバックは、InsecureSkipVerifyまたはClientAuthの設定に関係なく、再開を含むすべての接続で実行されます。 VerifyConnection func(ConnectionState) error // RootCAsは、クライアントがサーバー証明書を検証する際に使用するルート証明書機関のセットを定義します。 // RootCAsがnilの場合、TLSはホストのルートCAセットを使用します。 RootCAs *x509.CertPool // NextProtosはサポートされているアプリケーションレベルのプロトコルのリストで、 // 優先順位順に表示されます。両方のピアがALPNをサポートする場合、 // 選択されるプロトコルはこのリストから選ばれ、相互にサポートされるプロトコルがない場合は接続が失敗します。 // NextProtosが空であるか、ピアがALPNをサポートしていない場合、接続は成功し、 // ConnectionState.NegotiatedProtocolは空になります。 NextProtos []string // ServerNameは返された証明書のホスト名の検証に使用されます(InsecureSkipVerifyが指定されていない場合)。また、IPアドレスでない限り、クライアントのハンドシェイクに仮想ホスティングをサポートするために含まれます。 ServerName string // ClientAuthは、TLSクライアント認証のサーバーポリシーを決定します。デフォルトはNoClientCertです。 ClientAuth ClientAuthType // ClientCAsは、ClientAuthのポリシーに従って // クライアント証明書の検証が必要な場合、 // サーバーが使用するルート証明機関のセットを定義します。 ClientCAs *x509.CertPool // InsecureSkipVerifyは、クライアントがサーバーの証明書チェーンとホスト名を検証するかどうかを制御します。 // InsecureSkipVerifyがtrueの場合、crypto/tlsパッケージは、サーバーが提示する証明書とその証明書内の任意のホスト名を受け入れます。 // このモードでは、カスタムな検証が使用されていない限り、TLSはマンインザミドル攻撃に対して脆弱です。 // これはテスト目的でのみ使用するか、VerifyConnectionまたはVerifyPeerCertificateと組み合わせて使用する必要があります。 InsecureSkipVerify bool // CipherSuitesは有効なTLS 1.0-1.2の暗号化スイートのリストです。リストの順序は無視されます。注意事項として、TLS 1.3の暗号スイートは設定できません。 // // CipherSuitesがnilの場合、安全なデフォルトリストが使用されます。デフォルトの暗号スイートは時間とともに変更される可能性があります。 // Go 1.22では、RSA鍵交換ベースの暗号スイートがデフォルトリストから削除されましたが、GODEBUG設定tlsrsakex=1で再追加できます。 // Go 1.23では、3DES暗号スイートがデフォルトリストから削除されましたが、GODEBUG設定tls3des=1で再追加できます。 CipherSuites []uint16 // PreferServerCipherSuitesは古いフィールドであり、効果がありません。 // // かつて、このフィールドは、サーバーがクライアントの選好またはサーバーの選好に従うかどうかを制御していました。現在、サーバーは、推測されたクライアントのハードウェア、サーバーのハードウェア、およびセキュリティを考慮した論理に基づいて、最も相互にサポートされた暗号スイートを選択します。 // // Deprecated: PreferServerCipherSuitesは無視されます。 PreferServerCipherSuites bool // SessionTicketsDisabledがtrueに設定されると、セッションチケットおよびPSK(再開)のサポートが無効になります。クライアントでは、ClientSessionCacheがnilの場合もセッションチケットのサポートが無効になります。 SessionTicketsDisabled bool // SessionTicketKeyは、セッション再開を提供するためにTLSサーバーによって使用されます。 // RFC 5077およびRFC 8446のPSKモードを参照してください。ゼロの場合、最初のサーバーハンドシェイクの前にランダムデータで埋められます。 // // 廃止: このフィールドがゼロのままになっている場合、セッションチケットキーは自動的に毎日回転され、7日後に削除されます。 // 回転スケジュールのカスタマイズや同じホストに対して接続を終了するサーバーの同期を行う場合は、SetSessionTicketKeysを使用してください。 SessionTicketKey [32]byte // ClientSessionCacheはTLSセッション再開のためのClientSessionStateエントリのキャッシュです。 // クライアント側でのみ使用されます。 ClientSessionCache ClientSessionCache // UnwrapSessionは、[WrapSession]によって生成されたチケット/アイデンティティを、使用可能なセッションに変換するためにサーバー上で呼び出されます。 // // UnwrapSessionは通常、チケット内のセッション状態を復号化するか(たとえば、[Config.EncryptTicket]を使用して)、以前に保存された状態を回復するためにチケットを使用します。セッション状態を逆シリアル化するには、[ParseSessionState]を使用する必要があります。 // // UnwrapSessionがエラーを返した場合、接続は終了されます。(nil、nil)を返す場合、セッションは無視されます。crypto/tlsは、それでも返されたセッションを再開しないこともあります。 UnwrapSession func(identity []byte, cs ConnectionState) (*SessionState, error) // WrapSessionはサーバーで呼び出され、セッションのチケット/アイデンティティを生成します。 // // WrapSessionはセッションの状態を[SessionState.Bytes]でシリアライズする必要があります。 // 次に、シリアライズされた状態を暗号化する(たとえば[Config.DecryptTicket]で)または状態を保存して // ハンドルを返すことができます。 // // WrapSessionがエラーを返すと、接続は終了します。 // // 警告:返り値は平文でワイヤー上やクライアントに公開されます。 // アプリケーションはそれを暗号化し、認証する(およびキーをローテーションする) // または高エントロピーの識別子を返すことが責任です。 // 正しく行わないと、現在の接続や以前の接続、将来の接続が妥協される可能性があります。 // WrapSession func(ConnectionState, *SessionState) ([]byte, error) // MinVersionには受け入れ可能な最小のTLSバージョンが含まれています。 // // デフォルトでは、現在TLS 1.2が最小限として使用されています。TLS 1.0は、 // このパッケージがサポートする最小限です。 // // サーバーサイドのデフォルトは、GODEBUG環境変数に値 // "tls10server=1"を含めることでTLS 1.0に戻すことができます。 MinVersion uint16 // MaxVersionには許容される最大のTLSバージョンが含まれています。 // // デフォルトでは、このパッケージでサポートされている最大バージョンが使用されます。 // 現在のバージョンはTLS 1.3です。 MaxVersion uint16 // CurvePreferencesには、ECDHEハンドシェイクで使用される楕円曲線が好まれる順に含まれます。空の場合、デフォルトが使用されます。クライアントは、TLS 1.3でキーシェアのタイプとして最初の選択肢を使用します。将来的には、これは変更される可能性があります。 // // Go 1.23から、デフォルトにはX25519Kyber768Draft00ハイブリッドポスト量子鍵交換が含まれます。 // これを無効にするには、CurvePreferencesを明示的に設定するか、GODEBUG=tlskyber=0環境変数を使用します。 CurvePreferences []CurveID // DynamicRecordSizingDisabledはTLSレコードの適応的なサイズ調整を無効にします。 // trueの場合、常に最大のTLSレコードサイズが使用されます。falseの場合、 // TLSレコードのサイズはレイテンシを改善するために調整されることがあります。 DynamicRecordSizingDisabled bool // Renegotiationは、再交渉がサポートされるタイプを制御します。 // デフォルトの「なし」は、ほとんどのアプリケーションにとって正しいです。 Renegotiation RenegotiationSupport // KeyLogWriterは、TLSのマスターシークレットの宛先として使用できる、NSSキーログ形式の外部プログラム(Wiresharkなど)によるTLS接続の復号化を許可するためのオプションです。 // https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/Key_Log_Formatを参照してください。 // KeyLogWriterの使用はセキュリティを損なう可能性があり、デバッグ目的のみに使用するべきです。 KeyLogWriter io.Writer // EncryptedClientHelloConfigList is a serialized ECHConfigList. If // provided, clients will attempt to connect to servers using Encrypted // Client Hello (ECH) using one of the provided ECHConfigs. Servers // currently ignore this field. // // If the list contains no valid ECH configs, the handshake will fail // and return an error. // // If EncryptedClientHelloConfigList is set, MinVersion, if set, must // be VersionTLS13. // // When EncryptedClientHelloConfigList is set, the handshake will only // succeed if ECH is sucessfully negotiated. If the server rejects ECH, // an ECHRejectionError error will be returned, which may contain a new // ECHConfigList that the server suggests using. // // How this field is parsed may change in future Go versions, if the // encoding described in the final Encrypted Client Hello RFC changes. EncryptedClientHelloConfigList []byte // EncryptedClientHelloRejectionVerify, if not nil, is called when ECH is // rejected, in order to verify the ECH provider certificate in the outer // Client Hello. If it returns a non-nil error, the handshake is aborted and // that error results. // // Unlike VerifyPeerCertificate and VerifyConnection, normal certificate // verification will not be performed before calling // EncryptedClientHelloRejectionVerify. // // If EncryptedClientHelloRejectionVerify is nil and ECH is rejected, the // roots in RootCAs will be used to verify the ECH providers public // certificate. VerifyPeerCertificate and VerifyConnection are not called // when ECH is rejected, even if set, and InsecureSkipVerify is ignored. EncryptedClientHelloRejectionVerify func(ConnectionState) error // contains filtered or unexported fields }
Config構造体はTLSクライアントやサーバーを設定するために使用されます。 ConfigがTLS関数に渡された後は変更しないでください。 Configは再利用することができますが、tlsパッケージ自体は変更しません。
Example (KeyLogWriter) ¶
// ネットワークトラフィックキャプチャを復号化してTLSアプリケーションをデバッグする。 // 警告: KeyLogWriterの使用はセキュリティを損なう可能性があり、 // デバッグ目的でのみ使用すべきです。 // 再現性があるように、ダミーテストのためのHTTPサーバーです。セキュリティのないランダムを使用しているので、出力も同じになります。 server := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {})) server.TLS = &tls.Config{ Rand: zeroSource{}, // この例はただのサンプルです。これは実際には行わないでください。 } server.StartTLS() defer server.Close() // 通常、ログは開かれたファイルに保存されます: // w、err:= os.OpenFile("tls-secrets.txt"、os.O_WRONLY | os.O_CREATE | os.O_TRUNC、0600) w := os.Stdout client := &http.Client{ Transport: &http.Transport{ TLSClientConfig: &tls.Config{ KeyLogWriter: w, Rand: zeroSource{}, // 再現可能な出力のために、これを行わないでください。 InsecureSkipVerify: true, // テストサーバー証明書は信頼されていません。 }, }, } resp, err := client.Get(server.URL) if err != nil { log.Fatalf("Failed to get URL: %v", err) } resp.Body.Close() // 生成されたファイルは、Wiresharkで使用することができ、SSLプロトコルの設定で(Pre)-Master-Secretログファイル名を指定することで、TLS接続を復号化できます。
Output:
Example (VerifyConnection) ¶
package main import ( "github.com/shogo82148/std/crypto/tls" "github.com/shogo82148/std/crypto/x509" ) func main() { // VerifyConnection は、接続の検証を置き換え、カスタマイズするために使用できます。 // この例では、VerifyConnection の実装方法を示しており、通常 crypto/tls で行われるピアの証明書の検証とほぼ同等です。 // クライアント側の設定。 _ = &tls.Config{ // InsecureSkipVerifyを設定して、デフォルトの検証をスキップします。 // これによってVerifyConnectionは無効になりません。 InsecureSkipVerify: true, VerifyConnection: func(cs tls.ConnectionState) error { opts := x509.VerifyOptions{ DNSName: cs.ServerName, Intermediates: x509.NewCertPool(), } for _, cert := range cs.PeerCertificates[1:] { opts.Intermediates.AddCert(cert) } _, err := cs.PeerCertificates[0].Verify(opts) return err }, } // サーバーサイドの設定。 _ = &tls.Config{ // クライアント証明書を要求する(VerifyConnection は引き続き実行され、cs.PeerCertificates[0] にアクセスできなくなるとパニックする)が、デフォルトの検証子で検証しない。これにより VerifyConnection は無効になりません。 ClientAuth: tls.RequireAnyClientCert, VerifyConnection: func(cs tls.ConnectionState) error { opts := x509.VerifyOptions{ DNSName: cs.ServerName, Intermediates: x509.NewCertPool(), KeyUsages: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth}, } for _, cert := range cs.PeerCertificates[1:] { opts.Intermediates.AddCert(cert) } _, err := cs.PeerCertificates[0].Verify(opts) return err }, } // デフォルトの検証器で証明書が処理されていない場合、ConnectionState.VerifiedChains は nil になります。 }
Output:
func (*Config) BuildNameToCertificate ¶
func (c *Config) BuildNameToCertificate()
BuildNameToCertificateはc.Certificatesを解析し、各リーフ証明書のCommonNameとSubjectAlternateNameフィールドからc.NameToCertificateを構築します。 廃止されました: NameToCertificateは特定の名前に対して単一の証明書の関連付けしか許可しません。そのフィールドをnilのままにしておき、ライブラリに最初に互換性のあるチェーンを選択させます。
func (*Config) Clone ¶ added in v1.8.0
Cloneはcの浅いクローンを返します。cがnilの場合はnilを返します。TLSクライアントやサーバーによって 同時に使用されている Config をクローンすることは安全です。
func (*Config) DecryptTicket ¶ added in v1.21.0
func (c *Config) DecryptTicket(identity []byte, cs ConnectionState) (*SessionState, error)
DecryptTicketは[Config.EncryptTicket]によって暗号化されたチケットを復号化します。[Config.UnwrapSession]の実装として使用することができます。
もしチケットを復号化または解析できない場合、DecryptTicketは(nil, nil)を返します。
func (*Config) EncryptTicket ¶ added in v1.21.0
func (c *Config) EncryptTicket(cs ConnectionState, ss *SessionState) ([]byte, error)
EncryptTicketは、 Config で設定された(またはデフォルトの)セッションチケットキーを使用してチケットを暗号化します。これは [Config.WrapSession] の実装として使用できます。
func (*Config) SetSessionTicketKeys ¶ added in v1.5.0
SetSessionTicketKeysはサーバーのセッションチケットのキーを更新します。
新しいチケットを作成する際に最初のキーが使用され、すべてのキーはチケットの解読に使用できます。 セッションチケットのキーをローテーションするために、この関数を実行しても問題ありません(サーバーが実行中である場合)。 関数はキーが空の場合、パニックを発生させます。
この関数を呼び出すと、自動的なセッションチケットキーのローテーションが無効になります。
同じホストに接続を終了する複数のサーバーがある場合、すべてのサーバーは同じセッションチケットのキーを持つ必要があります。 セッションチケットのキーが漏洩した場合、以前に記録されたおよび将来のTLS接続でこれらのキーが使用される可能性があります。 これにより、接続が危険にさらされる可能性があります。
type Conn ¶
type Conn struct {
// contains filtered or unexported fields
}
Connはセキュア接続を表します。 net.Connインターフェースを実装しています。
func Client ¶
Client は、基礎となるトランスポートとして conn を使用して 新しい TLS クライアント側の接続を返します。 ユーザーは、config に ServerName または InsecureSkipVerify のどちらかを設定する必要があります。config は nil であってはなりません。
func Dial ¶
Dial関数は、net.Dialを使用して指定されたネットワークアドレスに接続し、 次にTLSハンドシェイクを開始して、結果として得られるTLSコネクションを返します。 Dialはnilのconfigurationをゼロのconfigurationと同等だと解釈します。 デフォルトの設定については、Configのドキュメンテーションを参照してください。
Example ¶
package main import ( "github.com/shogo82148/std/crypto/tls" "github.com/shogo82148/std/crypto/x509" ) func main() { // カスタムルート証明書セットで接続する。 const rootPEM = ` -- GlobalSign Root R2, valid until Dec 15, 2021 -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG 3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO 291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== -----END CERTIFICATE-----` // まず、ルート証明書のセットを作成します。この例では、1つしかありません。 // もしくは、現在のオペレーティングシステムのデフォルトのルートセットを使用するために、これを省略することも可能です。 roots := x509.NewCertPool() ok := roots.AppendCertsFromPEM([]byte(rootPEM)) if !ok { panic("failed to parse root certificate") } conn, err := tls.Dial("tcp", "mail.google.com:443", &tls.Config{ RootCAs: roots, }) if err != nil { panic("failed to connect: " + err.Error()) } conn.Close() }
Output:
func DialWithDialer ¶ added in v1.3.0
DialWithDialerは、dialer.Dialを使用して指定されたネットワークアドレスに接続し、 TLSハンドシェイクを開始し、結果のTLS接続を返します。dialerで指定されたタイムアウトや デッドラインは、接続とTLSハンドシェイク全体に適用されます。
DialWithDialerは、nilの設定をゼロの設定として解釈します。 デフォルトの内容については、 Config のドキュメントを参照してください。
DialWithDialerは、内部的にcontext.Backgroundを使用します。 コンテキストを指定するには、NetDialerを必要なダイアラに設定した Dialer.DialContext を使用してください。
func Server ¶
Serverは、基礎となるトランスポートとしてconnを使用して新しいTLSサーバーサイド接続を返します。 configの設定は、非nilであり、少なくとも1つの証明書を含んでいるか、またはGetCertificateを設定している必要があります。
func (*Conn) CloseWrite ¶ added in v1.8.0
CloseWriteは接続の書き込み側をシャットダウンします。ハンドシェイクが完了した後に一度だけ呼び出され、基礎となる接続上でCloseWriteを呼び出しません。ほとんどの呼び出し元は単に Conn.Close を使用すべきです。
func (*Conn) ConnectionState ¶
func (c *Conn) ConnectionState() ConnectionState
ConnectionState関数は、接続に関する基本的なTLSの詳細を返します。
func (*Conn) Handshake ¶
Handshakeはクライアントまたはサーバーのハンドシェイクプロトコルを実行します。 まだ実行されていない場合、ほとんどのこのパッケージの使用では、明示的にHandshakeを呼び出す必要はありません:最初の Conn.Read または Conn.Write が自動的に呼び出します。
ハンドシェイクのキャンセルやタイムアウトの設定に関して制御するためには、 Conn.HandshakeContext または Dialer のDialContextメソッドを使用します。
サーバーまたはクライアントが送信する証明書のRSAキーサイズは、拒否サービス攻撃を防ぐために、8192ビットに制限されています。この制限は、GODEBUG環境変数(例:GODEBUG=tlsmaxrsasize=4096)のtlsmaxrsasizeを設定することで上書きすることができます。
func (*Conn) HandshakeContext ¶ added in v1.17.0
HandshakeContextは、クライアントまたはサーバーのハンドシェイクプロトコルを実行します。 まだ実行されていない場合、提供されたコンテキストはnil以外である必要があります。 ハンドシェイクが完了する前にコンテキストがキャンセルされた場合、ハンドシェイクは中断され、エラーが返されます。 ハンドシェイクが完了すると、コンテキストのキャンセルは接続に影響を与えません。
このパッケージのほとんどの使用では、明示的にHandshakeContextを呼び出す必要はありません:最初の Conn.Read または Conn.Write が自動的に呼び出します。
func (*Conn) NetConn ¶ added in v1.18.0
NetConnはcによってラップされた基になる接続を返します。 ただし、この接続に直接書き込みまたは読み込みを行うと、TLSセッションが破損することに注意してください。
func (*Conn) OCSPResponse ¶
OCSPResponseは、TLSサーバーからステープルされたOCSP応答を返します(クライアント接続の場合のみ有効)。
func (*Conn) Read ¶
Readは接続からデータを読み込みます。
Conn.Handshake を呼び出すため、ハンドシェイクがまだ完了していない場合、 Readが呼び出される前にReadと Conn.Write の両方にデッドラインを設定する必要があります 無制限のブロッキングを防ぐためです。 Conn.SetDeadline 、 Conn.SetReadDeadline 、および Conn.SetWriteDeadline を参照してください。
func (*Conn) SetDeadline ¶
SetDeadlineは接続に関連付けられた読み込みと書き込みのタイムアウトを設定します。 tのゼロ値は、 Conn.Read と Conn.Write がタイムアウトしないことを意味します。 書き込みがタイムアウトした後、TLSの状態が破損し、将来の書き込みは同じエラーを返します。
func (*Conn) SetReadDeadline ¶
SetReadDeadlineは基礎となる接続の読み込みの期限を設定します。 tのゼロ値は、 Conn.Read がタイムアウトしないことを意味します。
func (*Conn) SetWriteDeadline ¶
SetWriteDeadlineは、基礎となる接続に書き込みの期限を設定します。 tのゼロ値は、 Conn.Write がタイムアウトしないことを意味します。 書き込みがタイムアウトした後、TLSの状態が壊れるため、以降の書き込みは同じエラーを返します。
func (*Conn) VerifyHostname ¶
VerifyHostnameは、ホストに接続するためのピア証明書チェーンが有効かどうかを確認します。有効であれば、nilを返します。そうでなければ、問題を説明するエラーを返します。
func (*Conn) Write ¶
Writeは接続にデータを書き込みます。
Conn.Handshake を呼び出すため、無期限のブロッキングを防ぐために ハンドシェイクが完了していない場合、Writeを呼び出す前に Conn.Read とWriteの両方に期限を設定する必要があります。 Conn.SetDeadline 、 Conn.SetReadDeadline 、および Conn.SetWriteDeadline を参照してください。
type ConnectionState ¶
type ConnectionState struct { // Versionは接続で使用されるTLSバージョンです(例:VersionTLS12)。 Version uint16 // HandshakeComplete はハンドシェイクが完了している場合に true です。 HandshakeComplete bool // DidResume は、この接続がセッションチケットや類似のメカニズムによって前のセッションから正常に再開された場合に true です。 DidResume bool // CipherSuiteは、接続のためにネゴシエートされた暗号スイートです(例: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256、TLS_AES_128_GCM_SHA256)。 CipherSuite uint16 // NegotiatedProtocolはALPNで交渉されたアプリケーションプロトコルです。 NegotiatedProtocol string // NegotiatedProtocolIsMutualは相互のNPN(Next Protocol Negotiation)交渉を示すために使われます。 // // 廃止予定:この値は常にtrueです。 NegotiatedProtocolIsMutual bool // ServerNameはクライアントが送信するServer Name Indication拡張機能の値です。これはサーバーとクライアントの両方で利用できます。 ServerName string // PeerCertificates は、ピアから送信された証明書が解析されたものであり、送信順に格納されています。最初の要素は、接続が検証されるリーフ証明書です。 // // クライアント側では空にすることはできません。サーバー側では、Config.ClientAuth が RequireAnyClientCert または RequireAndVerifyClientCert でない場合、空にすることができます。 // // PeerCertificates およびその内容は変更してはいけません。 PeerCertificates []*x509.Certificate // VerifiedChainsは、最初の要素がPeerCertificates[0]であり、最後の要素がConfig.RootCAs(クライアント側)またはConfig.ClientCAs(サーバー側)からの要素の1つ以上のチェーンのリストです。 // // クライアント側では、Config.InsecureSkipVerifyがfalseの場合に設定されます。サーバー側では、Config.ClientAuthがVerifyClientCertIfGiven(かつピアが証明書を提供した場合)またはRequireAndVerifyClientCertである場合に設定されます。 // // VerifiedChainsおよびその内容は変更しないでください。 VerifiedChains [][]*x509.Certificate // SignedCertificateTimestampsは、もしあれば、ピアからのTLSハンドシェイクによって提供されるリーフ証明書のSCTのリストです。 SignedCertificateTimestamps [][]byte // OCSPResponseは、ピアから提供される、必要に応じてリーフ証明書のステープル化されたオンライン証明書ステータスプロトコル(OCSP)レスポンスです。 OCSPResponse []byte // TLSUniqueには、"tls-unique"チャネルバインディングの値が格納されています(RFC 5929、セクション3を参照)。 // この値は、TLS 1.3接続や拡張されたマスターシークレット(RFC 7627)をサポートしていない再開接続ではnilになります。 TLSUnique []byte // ECHAccepted indicates if Encrypted Client Hello was offered by the client // and accepted by the server. Currently, ECH is supported only on the // client side. ECHAccepted bool // contains filtered or unexported fields }
ConnectionStateは接続に関する基本的なTLSの詳細を記録します。
func (*ConnectionState) ExportKeyingMaterial ¶ added in v1.11.0
func (cs *ConnectionState) ExportKeyingMaterial(label string, context []byte, length int) ([]byte, error)
ExportKeyingMaterialは、RFC 5705で定義されているように、新しいスライスにlengthバイトの エクスポートされた鍵マテリアルを返します。contextがnilの場合、それはシードの一部として使用されません。 接続がConfig.Renegotiationを介して再交渉を許可するように設定されていた場合、または接続がTLS 1.3も Extended Master Secretもサポートしていない場合、この関数はエラーを返します。
Extended Master SecretまたはTLS 1.3なしでの鍵マテリアルのエクスポートは、 セキュリティ上の問題(RFC 5705とRFC 7627のセキュリティ考慮事項セクションを参照)により、 Go 1.22で無効化されましたが、GODEBUG設定tlsunsafeekm=1で再度有効化できます。
type CurveID ¶ added in v1.3.0
type CurveID uint16
CurveIDは、鍵交換メカニズムのTLS識別子の型です。以下を参照してください。 https://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-8
TLS 1.2では、このレジストリは楕円曲線のみをサポートしていました。TLS 1.3では、 他のグループに拡張され、NamedGroupと改名されました。RFC 8446、セクション 4.2.7を参照してください。その後、ハイブリッド ポスト量子KEMなど、他のメカニズムにも拡張されました。
type Dialer ¶ added in v1.15.0
type Dialer struct { // NetDialerはTLS接続の基礎となるTCP接続に使用するオプションのダイアラです。 // nilのNetDialerはnet.Dialerのゼロ値と同じです。 NetDialer *net.Dialer // Config は新しい接続に使用するTLSの設定です。 // nilの設定はゼロと同等であり、デフォルトの設定についてはConfigのドキュメントを参照してください。 Config *Config }
Dialerは、設定と基礎となる接続のためのダイアラーを使用してTLS接続をダイアルします。
func (*Dialer) Dial ¶ added in v1.15.0
Dialは指定されたネットワークアドレスに接続し、TLSハンドシェイクを開始し、結果のTLS接続を返します。
返される Conn は、もし存在する場合は常に *Conn 型です。
内部的にDialはcontext.Backgroundを使用しますが、コンテキストを指定するにはDialContextを使用してください。
func (*Dialer) DialContext ¶ added in v1.15.0
DialContextは指定されたネットワークアドレスに接続し、TLSハンドシェイクを開始し、結果のTLS接続を返します。 提供されたContextはnil以外である必要があります。接続が完了する前にContextが期限切れになった場合、エラーが返されます。接続成功後、Contextが期限切れになっても接続には影響しません。 返される Conn (あれば)は常に *Conn 型です。
type ECHRejectionError ¶ added in v1.23.0
type ECHRejectionError struct {
RetryConfigList []byte
}
ECHRejectionError is the error type returned when ECH is rejected by a remote server. If the server offered a ECHConfigList to use for retries, the RetryConfigList field will contain this list.
The client may treat an ECHRejectionError with an empty set of RetryConfigs as a secure signal from the server.
func (*ECHRejectionError) Error ¶ added in v1.23.0
func (e *ECHRejectionError) Error() string
type QUICConfig ¶ added in v1.21.0
type QUICConfig struct { TLSConfig *Config // EnableSessionEvents may be set to true to enable the // [QUICStoreSession] and [QUICResumeSession] events for client connections. // When this event is enabled, sessions are not automatically // stored in the client session cache. // The application should use [QUICConn.StoreSession] to store sessions. EnableSessionEvents bool }
QUICConfigは QUICConn を設定します。
type QUICConn ¶ added in v1.21.0
type QUICConn struct {
// contains filtered or unexported fields
}
QUICConnは、RFC 9001で説明されているように、基礎となるトランスポートとしてQUICの実装を使用する接続を表します。
QUICConnのメソッドは同時に使用することはできません。
func QUICClient ¶ added in v1.21.0
func QUICClient(config *QUICConfig) *QUICConn
QUICClientは、QUICTransportを基礎とした新しいTLSクライアント側接続を返します。設定はnilであってはなりません。
設定のMinVersionは、少なくともTLS 1.3である必要があります。
func QUICServer ¶ added in v1.21.0
func QUICServer(config *QUICConfig) *QUICConn
QUICServerは、下層トランスポートとしてQUICTransportを使用した新しいTLSサーバーサイド接続を返します。設定はnilにできません。
設定のMinVersionは、少なくともTLS 1.3である必要があります。
func (*QUICConn) ConnectionState ¶ added in v1.21.0
func (q *QUICConn) ConnectionState() ConnectionState
ConnectionStateは接続に関する基本的なTLSの詳細を返します。
func (*QUICConn) HandleData ¶ added in v1.21.0
func (q *QUICConn) HandleData(level QUICEncryptionLevel, data []byte) error
HandleDataはピアから受信したハンドシェイクバイトを処理します。 接続イベントを生成することがあり、 QUICConn.NextEvent で読み取ることができます。
func (*QUICConn) NextEvent ¶ added in v1.21.0
NextEventは接続で発生する次のイベントを返します。 イベントが利用できない場合は、Kindが QUICNoEvent のイベントを返します。
func (*QUICConn) SendSessionTicket ¶ added in v1.21.0
func (q *QUICConn) SendSessionTicket(opts QUICSessionTicketOptions) error
SendSessionTicketはクライアントにセッションチケットを送信します。 これにより、接続イベントが生成され、 QUICConn.NextEvent で読み取ることができます。 現在、一度しか呼び出すことはできません。
func (*QUICConn) SetTransportParameters ¶ added in v1.21.0
SetTransportParametersはピアに送信するためのトランスポートパラメータを設定します。
サーバ接続では、クライアントのトランスポートパラメータを受信した後にトランスポートパラメータを設定することができます。 QUICTransportParametersRequired を参照してください。
func (*QUICConn) Start ¶ added in v1.21.0
Startはクライアントまたはサーバーのハンドシェイクプロトコルを開始します。 接続イベントを生成する場合があり、 QUICConn.NextEvent で読み取ることができます。
Startは1度以上呼び出すことはできません。
func (*QUICConn) StoreSession ¶ added in v1.23.0
func (q *QUICConn) StoreSession(session *SessionState) error
StoreSessionは、QUICStoreSessionイベントで以前受け取ったセッションをClientSessionCacheに保存します。 アプリケーションは、セッションを保存する前に追加のイベントを処理したり、SessionStateを変更したりすることができます。
type QUICEncryptionLevel ¶ added in v1.21.0
type QUICEncryptionLevel int
QUICEncryptionLevelは、ハンドシェイクメッセージを送信するために使用されるQUIC暗号化レベルを表します。
func (QUICEncryptionLevel) String ¶ added in v1.21.0
func (l QUICEncryptionLevel) String() string
type QUICEvent ¶ added in v1.21.0
type QUICEvent struct { Kind QUICEventKind // QUICSetReadSecret、QUICSetWriteSecret、およびQUICWriteDataに対する設定。 Level QUICEncryptionLevel // QUICTransportParameters、QUICSetReadSecret、QUICSetWriteSecret、およびQUICWriteDataに設定します。 // この内容はcrypto/tlsによって所有され、次のNextEvent呼び出しまで有効です。 Data []byte // QUICSetReadSecretおよびQUICSetWriteSecretに設定します。 Suite uint16 // Set for QUICResumeSession and QUICStoreSession. SessionState *SessionState }
QUICEventはQUIC接続で発生するイベントです。
イベントの種類はKindフィールドで指定されます。 他のフィールドの内容は、種別によって異なります。
type QUICEventKind ¶ added in v1.21.0
type QUICEventKind int
QUICEventKindはQUIC接続上での操作の種類です。
const ( // QUICNoEventは利用可能なイベントが存在しないことを示します。 QUICNoEvent QUICEventKind = iota // QUICSetReadSecretとQUICSetWriteSecretは、特定の暗号化レベルの読み取りと書き込みの秘密情報を提供します。 // QUICEvent.Level、QUICEvent.Data、QUICEvent.Suiteが設定されます。 // // Initial暗号化レベルの秘密情報は、最初の宛先接続IDから派生され、QUICConnによって提供されません。 QUICSetReadSecret QUICSetWriteSecret // QUICWriteDataはCRYPTOフレームでピアに送信するデータを提供します。 // QUICEvent.Dataが設定されています。 QUICWriteData // QUICTransportParametersは相手のQUICトランスポートパラメータを提供します。 // QUICEvent.Dataが設定されています。 QUICTransportParameters // QUICTransportParametersRequiredは、呼び出し元がピアに送信するためのQUICトランスポートパラメータを提供する必要があることを示します。呼び出し元は、QUICConn.SetTransportParametersを使用してトランスポートパラメータを設定し、QUICConn.NextEventを再度呼び出す必要があります。 // QUICConn.Startを呼び出す前にトランスポートパラメータが設定されている場合、接続は決してQUICTransportParametersRequiredイベントを生成しません。 QUICTransportParametersRequired // QUICRejectedEarlyDataは、サーバーが私たちが提供したものであっても、0-RTTデータを拒否したことを示しています。これは、QUICEncryptionLevelApplicationのキーが返される前に返されます。 // このイベントはクライアント接続でのみ発生します。 QUICRejectedEarlyData // QUICHandshakeDone は、TLS ハンドシェイクが完了したことを示します。 QUICHandshakeDone // QUICResumeSessionは、クライアントが以前のセッションを再開しようとしていることを示します。 // [QUICEvent.SessionState] が設定されます。 // // クライアント接続の場合、このイベントはセッションチケットが選択されたときに発生します。 // サーバー接続の場合、このイベントはクライアントのセッションチケットを受信したときに発生します。 // // アプリケーションは、セッションがそれをサポートしていても、0-RTTを拒否するために、次の [QUICConn.NextEvent] の呼び出し前に // [QUICEvent.SessionState.EarlyData] をfalseに設定することができます。 QUICResumeSession // QUICStoreSessionは、サーバーがセッションを再開するための状態をクライアントに提供したことを示します。 // [QUICEvent.SessionState] が設定されます。 // アプリケーションは [QUICConn.StoreSession] セッションを使用して [SessionState] を保存するべきです。 // アプリケーションは保存する前に [SessionState] を変更することができます。 // このイベントはクライアント接続でのみ発生します。 QUICStoreSession )
type QUICSessionTicketOptions ¶ added in v1.21.0
type RecordHeaderError ¶ added in v1.6.0
type RecordHeaderError struct { // Msgはエラーを説明する人が読みやすい文字列を含んでいます。 Msg string // RecordHeaderには、エラーを引き起こしたTLSレコードヘッダの5バイトが含まれています。 RecordHeader [5]byte // Connは、クライアントが初期ハンドシェイクを送信しているが、TLSのように見えない場合の基礎となるnet.Connを提供します。 // ハンドシェイクが既に行われているか、接続にTLSアラートが書き込まれている場合は、nilです。 Conn net.Conn }
RecordHeaderError は、TLS レコードヘッダが無効な場合に返されます。
func (RecordHeaderError) Error ¶ added in v1.6.0
func (e RecordHeaderError) Error() string
type RenegotiationSupport ¶ added in v1.7.0
type RenegotiationSupport int
RenegotiationSupportは、TLS renegotiationのサポートレベルを列挙しています。TLS renegotiationとは、最初の接続の後に接続で追加のhandshakeを行うことです。これにより、ステートマシンが複雑化し、多くの微妙なセキュリティ上の問題の原因となっています。再交渉の開始はサポートされていませんが、再交渉リクエストの受け入れには対応している場合があります。 有効にされていても、サーバーはハンドシェイク間で自身の識別情報を変更することはできません(つまり、リーフ証明書は同じである必要があります)。また、同時にハンドシェイクとアプリケーションデータのフローを行うことは許可されていないため、再交渉は、再交渉と同期するプロトコル(例:HTTPS)とのみ使用できます。 再交渉はTLS 1.3で定義されていません。
const ( // RenegotiateNeverは再交渉を無効にします。 RenegotiateNever RenegotiationSupport = iota // RenegotiateOnceAsClientは、リモートサーバーに対して // 接続ごとに再交渉を一度だけ要求することを可能にします。 RenegotiateOnceAsClient // RenegotiateFreelyAsClientは、リモートサーバーが繰り返し再交渉を要求できるようにします。 RenegotiateFreelyAsClient )
type SessionState ¶ added in v1.21.0
type SessionState struct { // Extraはcrypto/tlsによって無視されますが、[SessionState.Bytes]によってエンコードされ、[ParseSessionState]によって解析されます。 // // これにより、[Config.UnwrapSession]/[Config.WrapSession]や[ClientSessionCache]の実装が、このセッションとともに追加のデータを格納および取得できるようになります。 // // To allow different layers in a protocol stack to share this field, // applications must only append to it, not replace it, and must use entries // that can be recognized even if out of order (for example, by starting // with an id and version prefix). Extra [][]byte // EarlyDataは、QUIC接続で0-RTTに使用できるかを示します。 // サポートされていても、アプリケーションが0-RTTを提供しないことを拒否する場合は、これをfalseに設定することができます。 EarlyData bool // contains filtered or unexported fields }
SessionStateは再開可能なセッションです。
func ParseSessionState ¶ added in v1.21.0
func ParseSessionState(data []byte) (*SessionState, error)
ParseSessionStateは[SessionState.Bytes]でエンコードされた[SessionState]を解析します。
func (*SessionState) Bytes ¶ added in v1.21.0
func (s *SessionState) Bytes() ([]byte, error)
Bytesはセッションをエンコードし、[ParseSessionState]によって解析できるようにします。エンコードには、将来のセッションのセキュリティに重要な秘密値が含まれている可能性があります。
具体的なエンコーディングは不透明と見なされ、Goのバージョン間で非互換性がある可能性があります。
type SignatureScheme ¶ added in v1.8.0
type SignatureScheme uint16
SignatureSchemeは、TLSでサポートされる署名アルゴリズムを識別します。RFC 8446、セクション4.2.3を参照してください。
const ( // RSASSA-PKCS1-v1_5 アルゴリズム。 PKCS1WithSHA256 SignatureScheme = 0x0401 PKCS1WithSHA384 SignatureScheme = 0x0501 PKCS1WithSHA512 SignatureScheme = 0x0601 // 公開キーOID rsaEncryption を使用した RSASSA-PSS アルゴリズム。 PSSWithSHA256 SignatureScheme = 0x0804 PSSWithSHA384 SignatureScheme = 0x0805 PSSWithSHA512 SignatureScheme = 0x0806 // ECDSAアルゴリズム。TLS 1.3では特定の曲線に制約される。 ECDSAWithP256AndSHA256 SignatureScheme = 0x0403 ECDSAWithP384AndSHA384 SignatureScheme = 0x0503 ECDSAWithP521AndSHA512 SignatureScheme = 0x0603 // EdDSAアルゴリズム。 Ed25519 SignatureScheme = 0x0807 // TLS 1.2用の旧バージョンの署名およびハッシュアルゴリズム。 PKCS1WithSHA1 SignatureScheme = 0x0201 ECDSAWithSHA1 SignatureScheme = 0x0203 )
func (SignatureScheme) String ¶ added in v1.15.0
func (i SignatureScheme) String() string