Skip to content

Latest commit

 

History

History
107 lines (82 loc) · 2.83 KB

5_tls.md

File metadata and controls

107 lines (82 loc) · 2.83 KB

TLS

Интернэтэд мэдээллийг энкриптлэж явуулах хамгийн түгээмэл механизмT бол TLS (Transport Layer Security) юм. Өмнө нь үүнийг SSL (Secure Sockets Layer) гэж нэрлэдэг байсан.

TLS-д клиент болон сервер хоорондоо X.509 сертификат солилцож бие биенээ танина. Үүний дараа хувийн түлхүүр үүсгэнэ, ингээд энэ түлхүүрээр бүх энкрипт/декрипт явагдана. Эхний танилцах алхам нь бага зэрэг удаан, гэхдээ үүнээс хойших дамжуулалт хурдан байдаг.

Сервер нь:

// TLSEchoServer.go
package main

import (
        "crypto/rand"
        "crypto/tls"
        "fmt"
        "net"
        "os"
        "time"
)

func main() {

        cert, err := tls.LoadX509KeyPair("my.server.pem", "private.pem")
        checkError(err)
        config := tls.Config{Certificates: []tls.Certificate{cert}}

        now := time.Now()
        config.Time = func() time.Time { return now }
        config.Rand = rand.Reader

        service := "0.0.0.0:1200"

        listener, err := tls.Listen("tcp", service, &config)
        checkError(err)
        fmt.Println("Listening")
        for {
                conn, err := listener.Accept()
                if err != nil {
                        fmt.Println(err.Error())
                        continue
                }
                fmt.Println("Accepted")
                go handleClient(conn)
        }
}

func handleClient(conn net.Conn) {
        defer conn.Close()

        var buf [512]byte
        for {
                fmt.Println("Trying to read")
                n, err := conn.Read(buf[0:])
                if err != nil {
                        fmt.Println(err)
                }
                _, err2 := conn.Write(buf[0:n])
                if err2 != nil {
                        return
                }
        }
}

// func checkError(err error)

Энэ сервер нь дараах клиенттэй ажиллана:

// TLSEchoClient.go
package main

import (
        "fmt"
        "os"
        "crypto/tls"
)

func main() {
        if len(os.Args) != 2 {
                fmt.Println("Usage: ", os.Args[0], "host:port")
                os.Exit(1)
        }
        service := os.Args[1]

        conn, err := tls.Dial("tcp", service, nil)
        checkError(err)

        for n := 0; n < 10; n++ {
                fmt.Println("Writing...")
                conn.Write([]byte("Hello " + string(n+48)))

                var buf [512]byte
                n, err := conn.Read(buf[0:])
                checkError(err)

                fmt.Println(string(buf[0:n]))
        }
        os.Exit(0)
}

//func checkError(err error)