РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1289 of 1593 menu

Функция tls.Listen

Функция tls.Listen создает слушатель (listener) для TLS-соединений. Она принимает два параметра: сетевой протокол (обычно "tcp") и адрес для прослушивания (например, ":443"). Вторым параметром передается указатель на конфигурацию TLS tls.Config, которая содержит сертификаты и настройки шифрования. Функция возвращает объект типа net.Listener и ошибку.

Синтаксис

tls.Listen(network, laddr string, config *tls.Config) (net.Listener, error)

Пример

Давайте создадим простой TLS-сервер, который принимает соединения и отправляет приветственное сообщение:

package main import ( "crypto/tls" "fmt" "log" "net" ) func main() { cert, err := tls.LoadX509KeyPair("server.crt", "server.key") if err != nil { log.Fatal(err) } config := &tls.Config{ Certificates: []tls.Certificate{cert}, } listener, err := tls.Listen("tcp", ":8443", config) if err != nil { log.Fatal(err) } defer listener.Close() fmt.Println("Server started on :8443") for { conn, err := listener.Accept() if err != nil { log.Println(err) continue } go handleConnection(conn) } } func handleConnection(conn net.Conn) { defer conn.Close() conn.Write([]byte("Hello, TLS client!\n")) }

Пример

Давайте создадим TLS-сервер с настройками минимальной версии протокола и списком поддерживаемых шифров:

package main import ( "crypto/tls" "fmt" "log" "net" ) func main() { cert, err := tls.LoadX509KeyPair("server.crt", "server.key") if err != nil { log.Fatal(err) } config := &tls.Config{ Certificates: []tls.Certificate{cert}, MinVersion: tls.VersionTLS12, PreferServerCipherSuites: true, CipherSuites: []uint16{ tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, }, } listener, err := tls.Listen("tcp", ":8443", config) if err != nil { log.Fatal(err) } defer listener.Close() fmt.Println("Secure server started on :8443") for { conn, err := listener.Accept() if err != nil { log.Println(err) continue } go handleSecureConnection(conn) } } func handleSecureConnection(conn net.Conn) { defer conn.Close() conn.Write([]byte("Secure connection established\n")) }

Пример

Давайте создадим TLS-сервер с взаимной аутентификацией, требующий проверку клиентских сертификатов:

package main import ( "crypto/tls" "crypto/x509" "fmt" "log" "net" "os" ) func main() { cert, err := tls.LoadX509KeyPair("server.crt", "server.key") if err != nil { log.Fatal(err) } caCert, err := os.ReadFile("ca.crt") if err != nil { log.Fatal(err) } caCertPool := x509.NewCertPool() caCertPool.AppendCertsFromPEM(caCert) config := &tls.Config{ Certificates: []tls.Certificate{cert}, ClientAuth: tls.RequireAndVerifyClientCert, ClientCAs: caCertPool, } listener, err := tls.Listen("tcp", ":8443", config) if err != nil { log.Fatal(err) } defer listener.Close() fmt.Println("Mutual TLS server started on :8443") for { conn, err := listener.Accept() if err != nil { log.Println(err) continue } go handleMutualTLSConnection(conn) } } func handleMutualTLSConnection(conn net.Conn) { defer conn.Close() tlsConn, ok := conn.(*tls.Conn) if ok { state := tlsConn.ConnectionState() fmt.Printf("Client certificate: %s\n", state.PeerCertificates[0].Subject.CommonName) } conn.Write([]byte("Mutual TLS connection accepted\n")) }

Смотрите также

  • функцию tls.Dial,
    которая устанавливает TLS-соединение с сервером
  • структуру tls.Config,
    которая содержит настройки TLS-соединений
  • функцию tls.LoadX509KeyPair,
    которая загружает сертификат и ключ из файлов
  • структуру tls.Certificate,
    которая представляет X.509 сертификат
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить